{
 "cells": [
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.282573Z",
     "start_time": "2025-03-09T06:49:55.278865Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=13, micro=2, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.1\n",
      "numpy 2.2.3\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.1\n",
      "torch 2.6.0+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "当不对图片数据做任何处理时，可以查看图片的原始数据，如下：",
   "id": "975c02bec1124d7e"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.413538Z",
     "start_time": "2025-03-09T06:49:55.368828Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "mean=0.2860\n",
    "std=0.3205  # 训练集的均值和标准差\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    # transforms.ToTensor(),# 将图片的数据类型转换为Tensor并且会默认进行归一化（模型只能接收tensor类型数据）\n",
    "    # transforms.Normalize((mean,), (std,))  # 标准化\n",
    "])\n",
    "\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存放路径\n",
    "    train=True,  # True 表示训练集，False 表示测试集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=transform,  # 也可以直接写None，表示不进行任何处理\n",
    "\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存放路径\n",
    "    train=False,  # True 表示训练集，False 表示测试集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=transform,  # 也可以直接写None，表示不进行任何处理\n",
    ")"
   ],
   "id": "6b5eeab65da88354",
   "outputs": [],
   "execution_count": 23
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.420506Z",
     "start_time": "2025-03-09T06:49:55.414550Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img,label = train_ds[0]  \n",
    "print(type(img))\n",
    "print(\"图像尺寸为：\",img.size)  # 当为Image类型时，可以用size查看图片大小，返回一个元组\n",
    "print(\"图像的类型为：\",img.mode)  # 当为Image类型时，可以用mode查看图片模式，返回字符串 L表明是单通道的灰度图\n",
    "print(\"图像标签值为：\",label)\n",
    "print(img.getdata())  # 这样拿到的是一个迭代器，不能直接打印，但可以通过list()转换为列表\n",
    "print(list(img.getdata()))  # 这些也就是ToTensor()需要处理的图片数据 这些数据是0-255的灰度值"
   ],
   "id": "2a2976c71fc009e8",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'PIL.Image.Image'>\n",
      "图像尺寸为： (28, 28)\n",
      "图像的类型为： L\n",
      "图像标签值为： 9\n",
      "<ImagingCore object at 0x000001E889529270>\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "以下是经过ToTensor()处理后的图片数据：",
   "id": "44e491cd66217315"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.477078Z",
     "start_time": "2025-03-09T06:49:55.425051Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "mean=0.2860\n",
    "std=0.3205  # 训练集的均值和标准差\n",
    "\n",
    "# 定义数据集的变换\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),# 将图片的数据类型转换为Tensor并且会默认进行归一化（模型只能接收tensor类型数据）\n",
    "    transforms.Normalize((mean,), (std,))  # 标准化\n",
    "])\n",
    "\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存放路径\n",
    "    train=True,  # True 表示训练集，False 表示测试集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=transform,  # 使用上面定义的transform进行数据预处理\n",
    "\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",  # 数据集存放路径\n",
    "    train=False,  # True 表示训练集，False 表示测试集\n",
    "    download=True,  # 如果数据集不存在，则自动下载\n",
    "    transform=transform,  # 使用上面定义的transform进行数据预处理\n",
    ")\n",
    "\n",
    "# tips:torchvision数据集中没有直接提供训练集和验证集的划分，所以需要的话得实现人为划分"
   ],
   "id": "8339f66d4a1cb6d9",
   "outputs": [],
   "execution_count": 25
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.484445Z",
     "start_time": "2025-03-09T06:49:55.478291Z"
    }
   },
   "cell_type": "code",
   "source": "train_ds[0]  # 返回一个元组，第一个元素是图片数据，第二个元素是图片标签（图片数据已经转换为tensor类型且已经进行归一化）",
   "id": "784bb33a2eb4529e",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([[[-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.8012e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -7.3329e-01,  8.5650e-04, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
       "           -8.4341e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.8012e-01, -8.8012e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.5565e-01, -8.9236e-01, -4.5187e-01,\n",
       "            7.7171e-01,  6.6159e-01, -1.3374e-01, -2.3162e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.8012e-01, -8.5565e-01, -8.4341e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.5565e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.1894e-01, -8.9236e-01,  3.5569e-01,\n",
       "            1.6037e+00,  1.2611e+00,  7.4724e-01,  8.6960e-01,  6.1265e-01,\n",
       "           -6.1093e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -7.4553e-01, -7.7000e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.0042e+00,\n",
       "            1.9953e+00,  1.6405e+00,  1.2856e+00,  4.1687e-01,  1.0164e+00,\n",
       "            1.0776e+00,  4.4134e-01, -1.0927e-01, -6.1093e-01,  4.9800e-02,\n",
       "            6.9830e-01, -1.1379e-02, -7.0882e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.8012e-01, -8.9236e-01, -4.8087e-02,  1.6405e+00,\n",
       "            1.8362e+00,  1.7750e+00,  1.7506e+00,  1.7506e+00,  1.1021e+00,\n",
       "            6.6159e-01,  5.8817e-01,  6.0041e-01,  8.9407e-01,  8.3289e-01,\n",
       "            1.8439e-01,  1.2122e+00, -8.4794e-02],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
       "           -8.8012e-01, -8.8012e-01, -8.9236e-01,  1.5548e+00,  1.9463e+00,\n",
       "            1.9463e+00,  1.9586e+00,  1.9096e+00,  1.8362e+00,  1.8362e+00,\n",
       "            1.7383e+00,  1.7139e+00,  1.1143e+00,  6.6159e-01,  6.1265e-01,\n",
       "            1.5059e+00,  1.9096e+00, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.3468e+00,  1.8607e+00,\n",
       "            1.7506e+00,  1.8362e+00,  1.8974e+00,  1.9831e+00,  1.8852e+00,\n",
       "            1.8485e+00,  1.8240e+00,  1.8485e+00,  1.8118e+00,  1.8362e+00,\n",
       "            2.1054e+00,  1.2244e+00, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.4692e+00,  1.8974e+00,\n",
       "            1.7750e+00,  1.7139e+00,  1.5303e+00,  1.3101e+00,  1.7016e+00,\n",
       "            1.6772e+00,  1.6894e+00,  1.7139e+00,  1.8362e+00,  1.7995e+00,\n",
       "            2.0809e+00,  1.5793e+00, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
       "           -8.5565e-01, -8.9236e-01, -7.4553e-01,  1.7873e+00,  1.7995e+00,\n",
       "            1.7016e+00,  1.7750e+00,  1.4569e+00,  1.1755e+00,  1.8852e+00,\n",
       "            1.6527e+00,  1.7750e+00,  1.8485e+00,  1.7016e+00,  1.8729e+00,\n",
       "            1.5181e+00,  1.6649e+00, -2.5609e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.1894e-01, -8.9236e-01,  3.1899e-01,  2.0932e+00,  1.8240e+00,\n",
       "            1.7995e+00,  1.7750e+00,  1.5915e+00,  1.5303e+00,  1.8118e+00,\n",
       "            1.7383e+00,  1.7139e+00,  1.8240e+00,  1.7995e+00,  2.1054e+00,\n",
       "            5.6370e-01,  1.1510e+00, -2.0715e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.4341e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -2.1939e-01,  1.9953e+00,  1.8974e+00,\n",
       "            1.9219e+00,  1.8974e+00,  2.0442e+00,  1.9463e+00,  1.7139e+00,\n",
       "            1.7750e+00,  1.8362e+00,  1.9708e+00,  1.7628e+00,  1.7628e+00,\n",
       "            1.6649e+00,  2.3334e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.8012e-01, -8.4341e-01, -8.1894e-01,\n",
       "           -8.0671e-01, -8.6788e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01,  2.0075e+00,  1.8729e+00,  1.7628e+00,\n",
       "            1.8362e+00,  1.8240e+00,  1.7873e+00,  1.8240e+00,  1.8118e+00,\n",
       "            1.7506e+00,  1.8362e+00,  1.9096e+00,  1.7383e+00,  1.7750e+00,\n",
       "            2.2278e+00,  4.9800e-02, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.5565e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -1.3374e-01,\n",
       "            8.8183e-01,  1.6037e+00,  1.8974e+00,  1.6405e+00,  1.7139e+00,\n",
       "            1.8118e+00,  1.7750e+00,  1.6527e+00,  1.6894e+00,  1.7750e+00,\n",
       "            1.8485e+00,  1.8362e+00,  1.7873e+00,  1.7383e+00,  1.8485e+00,\n",
       "            2.0932e+00,  1.0531e+00, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -6.7211e-01,\n",
       "           -3.5398e-01,  1.1098e-01,  4.1687e-01,  1.4202e+00,  1.8974e+00,\n",
       "            1.7995e+00,  1.8240e+00,  1.7628e+00,  1.8729e+00,  1.5548e+00,\n",
       "            1.6160e+00,  1.6894e+00,  1.9219e+00,  1.8485e+00,  1.9708e+00,\n",
       "            1.2611e+00,  1.4080e+00,  2.1666e+00,  2.1421e+00,  1.9586e+00,\n",
       "            2.0198e+00,  1.7383e+00, -8.9236e-01],\n",
       "          [-8.9236e-01, -1.9492e-01,  1.3957e+00,  1.6527e+00,  1.8485e+00,\n",
       "            1.8118e+00,  1.8485e+00,  1.6527e+00,  1.6037e+00,  1.7261e+00,\n",
       "            1.6527e+00,  1.6649e+00,  1.5548e+00,  1.0531e+00,  2.1054e+00,\n",
       "            1.4692e+00,  1.6282e+00,  1.8362e+00,  2.2278e+00,  2.2278e+00,\n",
       "            1.8118e+00,  1.9708e+00,  1.8118e+00,  1.6894e+00,  1.7995e+00,\n",
       "            1.9463e+00,  2.1176e+00, -8.9236e-01],\n",
       "          [-8.5565e-01,  1.5793e+00,  1.8974e+00,  1.8485e+00,  1.8118e+00,\n",
       "            1.6894e+00,  1.6894e+00,  1.7261e+00,  1.6160e+00,  1.6160e+00,\n",
       "            1.6160e+00,  1.7995e+00,  2.0442e+00,  8.6507e-02,  9.4301e-01,\n",
       "            2.2278e+00,  1.9096e+00,  1.8118e+00,  1.4080e+00,  9.9196e-01,\n",
       "            1.4447e+00,  1.6772e+00,  1.6037e+00,  1.6649e+00,  1.8240e+00,\n",
       "            1.8974e+00,  1.8607e+00, -8.9236e-01],\n",
       "          [ 3.0675e-01,  1.9586e+00,  1.5303e+00,  1.6772e+00,  1.8240e+00,\n",
       "            1.9096e+00,  1.9096e+00,  1.9708e+00,  2.1544e+00,  1.7995e+00,\n",
       "            1.4814e+00,  1.7383e+00,  1.7628e+00,  2.0565e+00, -9.7030e-02,\n",
       "            8.5650e-04,  4.0464e-01,  5.3923e-01,  1.1633e+00,  1.7873e+00,\n",
       "            1.8118e+00,  1.7383e+00,  1.7628e+00,  1.8362e+00,  1.8362e+00,\n",
       "            1.8485e+00,  1.9096e+00, -5.3752e-01],\n",
       "          [ 2.5328e-02,  1.6037e+00,  1.7016e+00,  1.6037e+00,  1.4692e+00,\n",
       "            1.6160e+00,  1.6894e+00,  1.8607e+00,  1.7506e+00,  1.3713e+00,\n",
       "            1.5181e+00,  1.6282e+00,  1.5303e+00,  1.7139e+00,  2.0442e+00,\n",
       "            1.4936e+00,  1.8852e+00,  2.1054e+00,  2.0320e+00,  1.8362e+00,\n",
       "            1.7750e+00,  1.7016e+00,  1.6649e+00,  1.8240e+00,  1.7995e+00,\n",
       "            1.8118e+00,  1.9219e+00, -7.2558e-02],\n",
       "          [-3.0504e-01,  1.5915e+00,  1.3468e+00,  1.4814e+00,  1.7139e+00,\n",
       "            1.5181e+00,  1.3713e+00,  1.4324e+00,  1.4814e+00,  1.4569e+00,\n",
       "            1.5793e+00,  1.7261e+00,  1.7873e+00,  1.8118e+00,  1.7995e+00,\n",
       "            1.9953e+00,  1.8607e+00,  1.7506e+00,  1.5426e+00,  1.6282e+00,\n",
       "            1.3835e+00,  1.3223e+00,  1.2734e+00,  1.2122e+00,  1.3223e+00,\n",
       "            1.6160e+00,  1.6282e+00,  5.1476e-01],\n",
       "          [-8.9236e-01,  6.0041e-01,  1.7873e+00,  1.4692e+00,  1.2978e+00,\n",
       "            1.2000e+00,  1.3468e+00,  1.5059e+00,  1.6037e+00,  1.6772e+00,\n",
       "            1.7139e+00,  1.6405e+00,  1.6894e+00,  1.6772e+00,  1.5548e+00,\n",
       "            1.5059e+00,  1.4814e+00,  1.4447e+00,  1.4936e+00,  1.4447e+00,\n",
       "            1.5303e+00,  1.4569e+00,  1.2611e+00,  1.0164e+00,  1.1510e+00,\n",
       "            1.2734e+00,  1.6772e+00,  2.3334e-01],\n",
       "          [-8.9236e-01, -8.9236e-01,  1.3092e-02,  1.4202e+00,  1.7016e+00,\n",
       "            1.4447e+00,  1.2489e+00,  1.2122e+00,  1.2489e+00,  1.3223e+00,\n",
       "            1.3713e+00,  1.4080e+00,  1.4202e+00,  1.4080e+00,  1.4692e+00,\n",
       "            1.5303e+00,  1.6037e+00,  1.6649e+00,  1.6772e+00,  1.6772e+00,\n",
       "            1.6894e+00,  1.4080e+00,  1.4080e+00,  1.4814e+00,  1.4569e+00,\n",
       "            1.7506e+00,  1.1877e+00, -8.9236e-01],\n",
       "          [-8.6788e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.4794e-02,\n",
       "            1.5548e+00,  1.8240e+00,  2.0075e+00,  2.0320e+00,  2.0687e+00,\n",
       "            2.1176e+00,  2.0809e+00,  2.0932e+00,  1.8118e+00,  1.7995e+00,\n",
       "            1.4692e+00,  1.4447e+00,  1.2978e+00,  1.3346e+00,  1.3346e+00,\n",
       "            1.3223e+00,  1.2611e+00,  1.1388e+00,  1.1633e+00,  3.1899e-01,\n",
       "           -1.8268e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -4.0292e-01, -1.4597e-01, -3.5398e-01,\n",
       "           -1.1379e-02, -3.9069e-01, -4.6410e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
       "          [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
       "           -8.9236e-01, -8.9236e-01, -8.9236e-01]]]),\n",
       " 9)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 26
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.490192Z",
     "start_time": "2025-03-09T06:49:55.486647Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(type(train_ds))\n",
    "print(len(train_ds))  # 训练集样本数量\n",
    "print(type(train_ds[0]))  # 确认一下类型\n",
    "print(type(train_ds[0][0]))"
   ],
   "id": "566af9aa12e78b0",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'torchvision.datasets.mnist.FashionMNIST'>\n",
      "60000\n",
      "<class 'tuple'>\n",
      "<class 'torch.Tensor'>\n"
     ]
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:49:55.496349Z",
     "start_time": "2025-03-09T06:49:55.491028Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img_tensor,lable = train_ds[0]  # 拆包\n",
    "print(img_tensor)\n",
    "print(label)\n",
    "print(img_tensor.shape)"
   ],
   "id": "ca5674029ac619cf",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[[-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.8012e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -7.3329e-01,  8.5650e-04, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
      "          -8.4341e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.8012e-01, -8.8012e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.5565e-01, -8.9236e-01, -4.5187e-01,\n",
      "           7.7171e-01,  6.6159e-01, -1.3374e-01, -2.3162e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.8012e-01, -8.5565e-01, -8.4341e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.5565e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.1894e-01, -8.9236e-01,  3.5569e-01,\n",
      "           1.6037e+00,  1.2611e+00,  7.4724e-01,  8.6960e-01,  6.1265e-01,\n",
      "          -6.1093e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -7.4553e-01, -7.7000e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.0042e+00,\n",
      "           1.9953e+00,  1.6405e+00,  1.2856e+00,  4.1687e-01,  1.0164e+00,\n",
      "           1.0776e+00,  4.4134e-01, -1.0927e-01, -6.1093e-01,  4.9800e-02,\n",
      "           6.9830e-01, -1.1379e-02, -7.0882e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.8012e-01, -8.9236e-01, -4.8087e-02,  1.6405e+00,\n",
      "           1.8362e+00,  1.7750e+00,  1.7506e+00,  1.7506e+00,  1.1021e+00,\n",
      "           6.6159e-01,  5.8817e-01,  6.0041e-01,  8.9407e-01,  8.3289e-01,\n",
      "           1.8439e-01,  1.2122e+00, -8.4794e-02],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
      "          -8.8012e-01, -8.8012e-01, -8.9236e-01,  1.5548e+00,  1.9463e+00,\n",
      "           1.9463e+00,  1.9586e+00,  1.9096e+00,  1.8362e+00,  1.8362e+00,\n",
      "           1.7383e+00,  1.7139e+00,  1.1143e+00,  6.6159e-01,  6.1265e-01,\n",
      "           1.5059e+00,  1.9096e+00, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.3468e+00,  1.8607e+00,\n",
      "           1.7506e+00,  1.8362e+00,  1.8974e+00,  1.9831e+00,  1.8852e+00,\n",
      "           1.8485e+00,  1.8240e+00,  1.8485e+00,  1.8118e+00,  1.8362e+00,\n",
      "           2.1054e+00,  1.2244e+00, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01,  1.4692e+00,  1.8974e+00,\n",
      "           1.7750e+00,  1.7139e+00,  1.5303e+00,  1.3101e+00,  1.7016e+00,\n",
      "           1.6772e+00,  1.6894e+00,  1.7139e+00,  1.8362e+00,  1.7995e+00,\n",
      "           2.0809e+00,  1.5793e+00, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.8012e-01,\n",
      "          -8.5565e-01, -8.9236e-01, -7.4553e-01,  1.7873e+00,  1.7995e+00,\n",
      "           1.7016e+00,  1.7750e+00,  1.4569e+00,  1.1755e+00,  1.8852e+00,\n",
      "           1.6527e+00,  1.7750e+00,  1.8485e+00,  1.7016e+00,  1.8729e+00,\n",
      "           1.5181e+00,  1.6649e+00, -2.5609e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.1894e-01, -8.9236e-01,  3.1899e-01,  2.0932e+00,  1.8240e+00,\n",
      "           1.7995e+00,  1.7750e+00,  1.5915e+00,  1.5303e+00,  1.8118e+00,\n",
      "           1.7383e+00,  1.7139e+00,  1.8240e+00,  1.7995e+00,  2.1054e+00,\n",
      "           5.6370e-01,  1.1510e+00, -2.0715e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.4341e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -2.1939e-01,  1.9953e+00,  1.8974e+00,\n",
      "           1.9219e+00,  1.8974e+00,  2.0442e+00,  1.9463e+00,  1.7139e+00,\n",
      "           1.7750e+00,  1.8362e+00,  1.9708e+00,  1.7628e+00,  1.7628e+00,\n",
      "           1.6649e+00,  2.3334e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.8012e-01, -8.4341e-01, -8.1894e-01,\n",
      "          -8.0671e-01, -8.6788e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01,  2.0075e+00,  1.8729e+00,  1.7628e+00,\n",
      "           1.8362e+00,  1.8240e+00,  1.7873e+00,  1.8240e+00,  1.8118e+00,\n",
      "           1.7506e+00,  1.8362e+00,  1.9096e+00,  1.7383e+00,  1.7750e+00,\n",
      "           2.2278e+00,  4.9800e-02, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.5565e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -1.3374e-01,\n",
      "           8.8183e-01,  1.6037e+00,  1.8974e+00,  1.6405e+00,  1.7139e+00,\n",
      "           1.8118e+00,  1.7750e+00,  1.6527e+00,  1.6894e+00,  1.7750e+00,\n",
      "           1.8485e+00,  1.8362e+00,  1.7873e+00,  1.7383e+00,  1.8485e+00,\n",
      "           2.0932e+00,  1.0531e+00, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -6.7211e-01,\n",
      "          -3.5398e-01,  1.1098e-01,  4.1687e-01,  1.4202e+00,  1.8974e+00,\n",
      "           1.7995e+00,  1.8240e+00,  1.7628e+00,  1.8729e+00,  1.5548e+00,\n",
      "           1.6160e+00,  1.6894e+00,  1.9219e+00,  1.8485e+00,  1.9708e+00,\n",
      "           1.2611e+00,  1.4080e+00,  2.1666e+00,  2.1421e+00,  1.9586e+00,\n",
      "           2.0198e+00,  1.7383e+00, -8.9236e-01],\n",
      "         [-8.9236e-01, -1.9492e-01,  1.3957e+00,  1.6527e+00,  1.8485e+00,\n",
      "           1.8118e+00,  1.8485e+00,  1.6527e+00,  1.6037e+00,  1.7261e+00,\n",
      "           1.6527e+00,  1.6649e+00,  1.5548e+00,  1.0531e+00,  2.1054e+00,\n",
      "           1.4692e+00,  1.6282e+00,  1.8362e+00,  2.2278e+00,  2.2278e+00,\n",
      "           1.8118e+00,  1.9708e+00,  1.8118e+00,  1.6894e+00,  1.7995e+00,\n",
      "           1.9463e+00,  2.1176e+00, -8.9236e-01],\n",
      "         [-8.5565e-01,  1.5793e+00,  1.8974e+00,  1.8485e+00,  1.8118e+00,\n",
      "           1.6894e+00,  1.6894e+00,  1.7261e+00,  1.6160e+00,  1.6160e+00,\n",
      "           1.6160e+00,  1.7995e+00,  2.0442e+00,  8.6507e-02,  9.4301e-01,\n",
      "           2.2278e+00,  1.9096e+00,  1.8118e+00,  1.4080e+00,  9.9196e-01,\n",
      "           1.4447e+00,  1.6772e+00,  1.6037e+00,  1.6649e+00,  1.8240e+00,\n",
      "           1.8974e+00,  1.8607e+00, -8.9236e-01],\n",
      "         [ 3.0675e-01,  1.9586e+00,  1.5303e+00,  1.6772e+00,  1.8240e+00,\n",
      "           1.9096e+00,  1.9096e+00,  1.9708e+00,  2.1544e+00,  1.7995e+00,\n",
      "           1.4814e+00,  1.7383e+00,  1.7628e+00,  2.0565e+00, -9.7030e-02,\n",
      "           8.5650e-04,  4.0464e-01,  5.3923e-01,  1.1633e+00,  1.7873e+00,\n",
      "           1.8118e+00,  1.7383e+00,  1.7628e+00,  1.8362e+00,  1.8362e+00,\n",
      "           1.8485e+00,  1.9096e+00, -5.3752e-01],\n",
      "         [ 2.5328e-02,  1.6037e+00,  1.7016e+00,  1.6037e+00,  1.4692e+00,\n",
      "           1.6160e+00,  1.6894e+00,  1.8607e+00,  1.7506e+00,  1.3713e+00,\n",
      "           1.5181e+00,  1.6282e+00,  1.5303e+00,  1.7139e+00,  2.0442e+00,\n",
      "           1.4936e+00,  1.8852e+00,  2.1054e+00,  2.0320e+00,  1.8362e+00,\n",
      "           1.7750e+00,  1.7016e+00,  1.6649e+00,  1.8240e+00,  1.7995e+00,\n",
      "           1.8118e+00,  1.9219e+00, -7.2558e-02],\n",
      "         [-3.0504e-01,  1.5915e+00,  1.3468e+00,  1.4814e+00,  1.7139e+00,\n",
      "           1.5181e+00,  1.3713e+00,  1.4324e+00,  1.4814e+00,  1.4569e+00,\n",
      "           1.5793e+00,  1.7261e+00,  1.7873e+00,  1.8118e+00,  1.7995e+00,\n",
      "           1.9953e+00,  1.8607e+00,  1.7506e+00,  1.5426e+00,  1.6282e+00,\n",
      "           1.3835e+00,  1.3223e+00,  1.2734e+00,  1.2122e+00,  1.3223e+00,\n",
      "           1.6160e+00,  1.6282e+00,  5.1476e-01],\n",
      "         [-8.9236e-01,  6.0041e-01,  1.7873e+00,  1.4692e+00,  1.2978e+00,\n",
      "           1.2000e+00,  1.3468e+00,  1.5059e+00,  1.6037e+00,  1.6772e+00,\n",
      "           1.7139e+00,  1.6405e+00,  1.6894e+00,  1.6772e+00,  1.5548e+00,\n",
      "           1.5059e+00,  1.4814e+00,  1.4447e+00,  1.4936e+00,  1.4447e+00,\n",
      "           1.5303e+00,  1.4569e+00,  1.2611e+00,  1.0164e+00,  1.1510e+00,\n",
      "           1.2734e+00,  1.6772e+00,  2.3334e-01],\n",
      "         [-8.9236e-01, -8.9236e-01,  1.3092e-02,  1.4202e+00,  1.7016e+00,\n",
      "           1.4447e+00,  1.2489e+00,  1.2122e+00,  1.2489e+00,  1.3223e+00,\n",
      "           1.3713e+00,  1.4080e+00,  1.4202e+00,  1.4080e+00,  1.4692e+00,\n",
      "           1.5303e+00,  1.6037e+00,  1.6649e+00,  1.6772e+00,  1.6772e+00,\n",
      "           1.6894e+00,  1.4080e+00,  1.4080e+00,  1.4814e+00,  1.4569e+00,\n",
      "           1.7506e+00,  1.1877e+00, -8.9236e-01],\n",
      "         [-8.6788e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.4794e-02,\n",
      "           1.5548e+00,  1.8240e+00,  2.0075e+00,  2.0320e+00,  2.0687e+00,\n",
      "           2.1176e+00,  2.0809e+00,  2.0932e+00,  1.8118e+00,  1.7995e+00,\n",
      "           1.4692e+00,  1.4447e+00,  1.2978e+00,  1.3346e+00,  1.3346e+00,\n",
      "           1.3223e+00,  1.2611e+00,  1.1388e+00,  1.1633e+00,  3.1899e-01,\n",
      "          -1.8268e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -4.0292e-01, -1.4597e-01, -3.5398e-01,\n",
      "          -1.1379e-02, -3.9069e-01, -4.6410e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01],\n",
      "         [-8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01, -8.9236e-01,\n",
      "          -8.9236e-01, -8.9236e-01, -8.9236e-01]]])\n",
      "9\n",
      "torch.Size([1, 28, 28])\n"
     ]
    }
   ],
   "execution_count": 28
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "接下来计算均值和方差：",
   "id": "efeeb674f537d892"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:00.089001Z",
     "start_time": "2025-03-09T06:49:55.506256Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def cal_mean_std(ds):\n",
    "   mean=0.\n",
    "   std=0.\n",
    "   for img,_ in ds:\n",
    "       # mean() 方法的主要作用是对张量中的元素进行求平均操作，根据传入的参数不同，可以计算整个张量的平均值，也可以沿着指定维度计算平均值。\n",
    "       # 以代码中的 img 张量为例，它的形状是 [1, 28, 28]，img.mean(dim=(1, 2)) 会一次性计算出这 28×28 个像素值的平均值，得到一个形状为 [1] 的张量，这个张量代表了这张图像所有像素的均值，然后这个均值会被累加到 mean 上。\n",
    "       # 在 PyTorch 中，张量的维度是从 0 开始编号的。对于形状为 [1, 28, 28] 的图像张量，第 0 维表示通道数，第 1 维表示图像的高度，第 2 维表示图像的宽度。\n",
    "       mean += img.mean(dim=(1,2))\n",
    "       std += img.std(dim=(1,2))\n",
    "   mean=mean/len(ds)  # 计算平均值\n",
    "   std=std/len(ds)  # 计算标准差\n",
    "   return mean,std\n",
    "print(cal_mean_std(train_ds))"
   ],
   "id": "2fcde247bc29f11a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.0001]), tensor([0.9999]))\n"
     ]
    }
   ],
   "execution_count": 29
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "利用matplotlib库绘制图像：",
   "id": "e90903c3082e8e04"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:00.269767Z",
     "start_time": "2025-03-09T06:50:00.090049Z"
    }
   },
   "cell_type": "code",
   "source": [
    "def show_imgs(n_rows,n_cols,train_ds,class_names):\n",
    "    \"\"\"\n",
    "    :param n_rows: 表示要显示的图像网格的行数。\n",
    "    :param n_cols: 表示要显示的图像网格的列数。\n",
    "    :param train_ds: 是一个数据集对象，包含了图像数据和对应的标签。\n",
    "    :param class_names: 是一个列表，包含了每个类别对应的名称，用于显示图像的类别标签。\n",
    "    :return: \n",
    "    \"\"\"\n",
    "    assert n_rows*n_cols<=len(train_ds)  # 确保要打印的图片数量不超过数据集的数量\n",
    "    plt.figure(figsize=(n_cols*1.4,n_rows*1.6))  # 设置图像的尺寸，宽为n_cols*1.4，高为n_rows*1.6\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index=n_cols*row+col  # 计算当前图像的索引\n",
    "            # plt.subplot() 函数用于在图形窗口中创建一个子图，指定子图的行数、列数和当前子图的位置（位置从 1 开始，所以需要 index + 1）\n",
    "            plt.subplot(n_rows,n_cols,index+1)   \n",
    "            img_arr,label=train_ds[index]  # 通过索引获取图像数据和标签\n",
    "            # 使用 np.transpose() 函数调整图像数组的维度顺序。在 PyTorch 中，图像数据通常以 (通道, 高度, 宽度) 的格式存储，而 matplotlib 中的 imshow() 函数要求图像数据以 (高度, 宽度, 通道) 的格式存储，因此需要将通道维度移到最后。\n",
    "            img_arr=np.transpose(img_arr,(1,2,0))\n",
    "            plt.imshow(img_arr,cmap=\"binary\",interpolation = 'nearest')  # 显示图像\n",
    "            plt.axis('off')  # 关闭坐标轴\n",
    "            plt.title(class_names[label])  # 显示图像的类别标签\n",
    "    plt.show()  # 显示图像\n",
    "    \n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot'] #0-9分别代表的类别\n",
    "\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)  # 3行5列，共15个样本"
   ],
   "id": "60a692edc8e4fb04",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapUuejrJW7Yf8FFVEnae0mervWamitXLqtFixauNVXUQ/L58JoayTiQOqJCF8kMST44B/+fJG1kZKMiGxbZxIi4UVQt8icu2Pv377d++umnBJ8pWbKk63W4UbW+9cyZM7bNTa1atWxxlmwoLsSmTZustWvX2iI2/KtYsaJ9XDYjF0JcFLWBW/jzIq4TRLdcoUIF65JLLvG0KJfj4f/lfKIP9qsXD8gGT7wmwn8HDx50JsfNN99s61hFXHnjjTdao0aN8rRpinTseCHqP5J02H+x2ae4NslDXPHixROsqcePH7cKFiyYYF2Vz4fX1EjGwQMPPGCvpWKALN8jqvoffvghFX9xsOEcTKGNjOjM9u7da29m5MYe/hP7EsHL6FckFF6g8asg0hfZyPzyyy8RD3axkRHjMdnxe/3JRCJpg+jcixQp4vyF7adEgvftt99aixYtsnWvYjskC5w88Wmj7kjHjhcmuyoSGey/2GLXrl32BgXDZMiaqx/OZE2VTYxpTRX37kjHgZxHnDbE7TtsOyibmm7duqXyrw8mnIMpZOwrGxUZnO+9916CY6IKmjBhgm3ZnJQGkM6R88vu8pZbbrHVMBfyUxcD2ZUrV9qqqKRGJtyzZ08Ct0MxFBYkTo5QqlQpa9WqVfYkx4m/fv1653j4/x9//NEW3+KTj64X/r2xTNeuXW0jwjB6TDRo0MD+e+WVV2yDNPGYkA2yGEGnFLHe5skJ+y+2CMcnEdX9hdZUWcOuvPLKiNbxC40Dkay3a9fO/pP1Ux4u33//fduLirHH/OEcTAGJjHjuyGZF4hGIy7X+k52h3MBl951UZNDLd8jOUwa+BNvzQyRBshv98MMPPa9XNigXQiz3ZWKFEV95eS2iVNnhCuLVJKK9sWPHuj737rvv2npjEfWF64n6TSz8EfFWkgEgTyNhZOMkHk+xStmyZa1rr73W+ZOFMSzS1E8D4t0lJMZlPimEvTJiud2TC/Zf7CCS9JdeeslWFYRdrP3WVFnDpL5G1rxw20cyDg4fPuw6Lg+BYQ+XlB4rsQDnYApIZGSDIhsVERF6ITtDufmLVEUMjJKK7DrFiEkMduXGL4a0pnxI4lIo9jT33XefLbaUjpZJKBIQeV9cnzE4lBdi0yKugWIPI/pc2ayIOFR878PuaeIiLZsbcbcWA2CR1IhoT9wIJd5CWPoimy+xH3r66aft84m7mrg7igu5RNdEF2vZJMmTj0TclGuQRSYe0j1I7BxJbyHue9IeMqZkIyoxJmQjmJLI2BLjNelj6eu8efPaY4v5tiKH/RfdiCRb1j/ZdIjdomxiRCUk0mBZwyUujB/yUCbODq+99pq9Doqbr6yDYjsjhsASA0YeXCMZByIZOHLkiL2Wi42M2AjKw5/cdFMjYm2swjkIJNbNqV27dqHMmTOHTp06ZazTvXv3UIYMGUKHDh1y3L8GDRqUoJ5230L36zByjipVqoQKFy4c2rRpk6f7ddgNeuDAgaGqVauGMmXKFMqTJ0+odu3aoRdeeCF0/Phx398k55LPiUu5uFLL7ytVqlRo2LBhCeru378/dNddd4Xy588fypgxY6h69eq2y6Pm5MmToUceeSRUtGhRuy0qVKhgt4G4qSPr168PXX311aEsWbLY7RFkV+zEuA4uX7481Llz51DJkiXt/hI397Zt29p9ECYxY8fkOijX5MXChQvt8SF9GE1uhGkJ+y923K/Df9I+sna2aNEi9M477zghIvzWXOSDDz6w21nWpxw5ctjrXb9+/UJ79uyJeBx8++23oeuuu84+JtcjdXv16hXau3dvCrZEMOEcTBrp5B/c2BBCCCGExE32a0IIIYSQtIIbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYkpRricQnGHIoqbk21q1b55QlnUWYcMLRMJL9PAxmQJdMvYhkPQ8jOb4wrDfSr18/p5w7d+4kXXs8ojPHf/rpp64cMGEKFy580d8lEWR1XrIwkuU3TDjSNjGzbds2pyxR0RGJMB5GIrJihHTkiiuu8OyPcePGuepJZPIwmKuuS5curnoSGZ1EN3v27HHKEmk+KFAiQwghhJDAwsi+5KKlLr/99pvrNSbV1E9vmE4eU81Lck9EcrMkFsn5EQazk+snSpQe6CzAjz32mFOuXr26FY9gv0gWXURyinlJyiS/GoLHUIKC59bJ7Xbu3OmU27dv76rXsGFDp3zLLbck4tfEdj4lTEiLYIZkSYCLYJ6lEydOeEo3BcnRFEbyypmkokWKFHHKuXLlcso6ceGuXbucsiQ/DDN06FDP3xfPSF6qMJIcEsmfP79TxkTJpaGPIpW6CJIX0GsdLlmypKue5Cz0krxFA5TIEEIIISSwcCNDCCGEkMDCjQwhhBBCAgttZEjEoD4dPVZWrlzpqodDKnv27EbdPera0XZGOHfunFM+fvy4U86aNaurHn4uUpueM2fOGG1z0J6gcePGrmOjR4+24o1vvvnG2H+vvPKKUe+O9hVoK6E9xnLkyOFpN3H77be76qFtjbafiSe2bNnilJ9//nmnXLBgQVc9HNfnz593HUP7MZyDaKOkwbml52rOnDk97aG0LU2+fPk87WX0mBg8eLAV7zRt2tSzz/V8wn7Ortbajh07eq5d//77r9FmCvsC57rXOh9NUCJDCCGEkMDCjQwhhBBCAkvMBMTTGjKTmuHkyZOu1/Pnz3fKrVq1iuj8KJrT4tOkXi+S1GBzKU2HDh2c8h9//OGUCxUqZLx+LcbUYmlTPWwfFEnreqbP+IEiUxSr6mufN2+eMZhf5cqVrXhAu9Ci6Ll3795O+d1333XVy5Qpk+c5tBqhdu3aTvmuu+5yytu3b3fV0+7d8QqqXfzaBNVJqErVcxDXrzJlyrjqoSs1nkOvT3qMeJ1bOHv2rKer8Jo1a1z1pk6d6pTbtm1rxSMYqBCDG+r1EMNU7Nu3z1UP5ySqhVatWuWqlydPHs8+wu+JdiiRIYQQQkhg4UaGEEIIIYElZlRL2jIfxaebN292yh999JFRzYDRCrXKoV69ehGpk1C9oa8Jj/mdA9UnJlVMarBs2TLXa1QnYXRJ9DDSaK+g3bt3ex7TbYXtg+2hI/aaPI50Ph70jilevLjn92j0d+HYiRfPCmw34dChQ065VKlSxvbAfj548KAx+iiOIzy3HlN0rvxfunfv7hnNV6uZUN2r1emmXFUYjVn3m8lLycuT0ASe/9ixY57zMZ7VSUi5cuWc8uLFi13H8J6AKlw/cN5plTnmVMI1+fTp01ZQoESGEEIIIYGFGxlCCCGEBBZuZAghhBASWGLGRsbPzXfWrFlOeebMma56JUqU8HQj1PrBGTNmOOWePXtG5HrsZ9+CkUq1LUakOueUZvbs2a7X2D7ojqmvH+1dtA73jTfe8Myai/2gI8ViPW1Lg/p+tJHRWZaXL1/umW1X2xag+6H+XZjJO15sZPzG8OHDh43H0PYFs43reYW2NH5RmqM1JEFqg7Z6mBF80qRJrnr169c32hthH6Cbr7aRwbmBNoO6D3HOoMv2gQMHjL8DbTFef/11Y714BcM76DUP5wLadWZU/afdrE32n2h/hn2pbaGiGUpkCCGEEBJYuJEhhBBCSGCJGdWSFqshS5YsMUYMRbEdlq+77jpXvd9++80p9+vXzynXqVPHVa969erG6K+//vqr5zU1atTIVQ9FxiiqTW2+/fZb12sU/WNbaRdmFD3r60e1HKrrtKt3jx49nPL777/vlKtWreqqhyouVC/qJHqPPPKIUx4+fLinKFWfD8W2wvr1653yxo0bnXLFihWtWMUvYjaOB63aRffapHyXViX5ufjHKw8//LBTfvvtt13H0DVeq09xXKMa20+VgO2vz4fH/FQTmPwVo6gHSYWRWviFiMC5hur0IqCCF2rVquXZxtrdXauuouHek1gokSGEEEJIYOFGhhBCCCGBJdCqJT9RNHonLV261CjGPHXqlKe6AMtC3bp1nXL58uWN3jELFy50yuPHj3cdQxEheh98+OGHRjVZs2bNrLQCE41pzyIUb5qSxmlxsqZly5ZOOXv27MYEjW+++aZn4kphypQpniJuFKtqryXsB+2BgZ5K2msJf/+iRYviQrWkxzf2NXo/aNUSth0e84vQa1LzeiU+jFdwjOM4XrBggave008/bTwHqpPQ609H4cao59iHuh56JprUFPpYu3btjPWIW02kIzHjHEL1bgZVD9XwqPLTfYQqJJzffn0ZbVAiQwghhJDAwo0MIYQQQgILNzKEEEIICSxRbyOT1Ky3AwYMcMp79+411kMbCb+sovPnz/e0udG2OVdccYVTrlChgusYnn/YsGFOeevWrcYIsqnN6tWrjW6WJndbbR+BOnSMHKpZu3atsb2xz1Dfr8cD6oXxGNqw+OmfMYLwhaLLos3A3LlznXK3bt2sWMUvC3Wkmd6TkhFe19NjLF4xZWvXrrdly5Z1ytu2bXMdQ9smzG6ubcKwHvaHtmfDLNl+fViyZEnPaycJwbVXhwypVKmSZx+F1NqoQ0tEYnODY8AvpEm0QYkMIYQQQgILNzKEEEIICSxRr1pKarK4PHnyeKopUD2g3c1QFKfdTlGEh6oTfX2ogkJXbC3C279/v1O+/vrrrWhh4MCBRjdLjAjq58KMbaXFmKiWw6SDR44ccdXDvsC20ufD78Iolzqy7NixY53y0aNHjeMBP6eP4TXpSMSxilYPoOsuqnv8VEZ+iSdN81urGkniwPbXaxmqD3D9QzWTnk84z/xUDn59raNtEzOYaFVjSvJ43sddGueZVhfja5zTeA+NdiiRIYQQQkhg4UaGEEIIIYGFGxlCCCGEBJaot5FJKmi34afLRzsI1Evmy5fPVQ9d4FDHrF3e/EJ54+dQl7xr1y4rWsBM3GibImzevNkz9YC2kUG3c+3SWb9+fc820PXwNfaZdik0ue9qd11MTYEpBTBFhf4u3bdFixZ1yu3bt7fiAT+9O7ax7j+/OWcCdfXaRkaPReJuV93+xYoVc8qrVq0yfg7bWZ8D00LgMZ0uAtdQtKU5dOiQq57Oumyy2TC5mMcr2KaJIR3YxZiy1uv2xjUvSFnJKZEhhBBCSGDhRoYQQgghgSXqZXhavI9iURSRaRdDjNiK4lPtOoguhlgPXY21KgXVTlqtgufTETBPnDjhlKtXr25Ub6CLcp06dazU5IEHHvAsa7flTZs2OeURI0a46s2ZM8cY2Rd/d+7cuT3bLamZV/0iyKJ4FvuyRo0arnpjxoyx4h3sZ62iM2WcT2qmXFRZoIpBi9NxnqFqI6li91indOnSxj7EuYZ9XapUKaPKAUMlaLdcrIfrq167qTJK2RAk6VQ901zV9XDu4jF9D4xmKJEhhBBCSGDhRoYQQgghgSXqZX1aDIZiUlQtYeRWHc0XE3BpTyI8B6p4/vjjD1c9jCiL0TC1uBS9avR3oRV/7969nfKKFSt8rfijBRQp16tXz+hhMmvWLGP/Ydthe+vfrD0oTOJqU8Iz/B7df6iaQC8tkrA/dd8mVcwdiaoY0eqQXLlyOWWqky4MRmD2i7Zr8g7081rSqiVMGqlV/IhWH5PkTZwcUvVwTfXz6MS+xfKBAwesoECJDCGEEEICCzcyhBBCCAks3MgQQgghJLBEvY2Mtp0wZV6tVq2a6zXq9tFuResHUX+MOkGth0c3YrwmHWkW7T60LrlEiRKebr5PPPGEq16DBg2saEDrXPG3Yj9oewjMouvX3n72FibXwaRissVAF3CNny45Oa4pWsHfptsgtb5X2ziRhJjsyLRNBNoI6rnrl+EY5wZ+Rtv+FSpUyNNeJkjuu7FoI3Pe4FbtZ0uDtoQYzT7aoUSGEEIIIYGFGxlCCCGExLdqCUVVfsnisB6KsCIVkfrRqlUr12uMqotJzfxcAFEEq1Va6IpoUm/p6/VLpIeJ3NC1NJrQ6hPsM6RcuXKu15hsLFLVYKRRKSPFL4Iz4tf2evz6ubHGEn7qJD933eT8jF/b+yVLjCf82gGjiGP0Xr0eYsRev/UQIytjZGy/Oa37UIe0CMOIv0lXLfkluY10PTWFNKFqiRBCCCEkFeBGhhBCCCGBJUkyPT9PlOQWE86dO9f1ety4cU55/vz5npEsdWJH9IDQYjW8XjyH/o14DlQz6fP5WeqjegPrjR8/3lWvXbt2VjRiStiJomrtMYZtpdVT6AWlxaImK/tII8P6JR3Ec8SLuigx+I1vU7/odsR+idTzyU/8ja9xHsVzlF8/tRqqhapWreo6VrJkSc95odty//79nuojnVwSP4cqrSJFirjq7d692+fXEGTjxo1GtXikyVpDPuumqR7eDzESfbRDiQwhhBBCAgs3MoQQQggJLNzIEEIIISSwJMmgJVK7giNHjrhe79mzx1MHiO9rmxGsp+0vUD+obVPQrbBo0aJGPTDaaaBOWGf9RV0yZkw+efKkq968efOMOmx09UVbkcWLF1tBwOQGrX+nXwRcvwiTKakHxmtCmw0/O4NYjt7rh1+bRuoWH2k00qR8PlIX7ngG1yEdHgFtXHA9xIjcem07duyY0R4R7Wf0Wo7g+opR1AsWLOiqR/d6y1q3bp1TLl68uLG98b6kwXXObz5hPbzv7du3z1Vv4cKFnvfAaCA+RwkhhBBCYgJuZAghhBASX6qlRYsWuV4/++yznknDUBzpF+FTJ+5D1ZUWd6LoC8Vl2gUYRV9jx451ynXr1nXVQ3dBFLP6RTXEqLx//vmn6xiKAbW6C8WAmFwySBEUIwHFy7pvTa64fiqMpKA/j6o8PKYjD5PkSRQZqQrRpKrS/YLXFM99ZlK77Ny501Xv999/d8ply5Z1HcNIv6iCL1++vKserlFbt241JprENdQPjLaOSXP79u3rqhev6iTkp59+MqpwcQz4qeFCEaqBTckl9XgYMWKEU6ZqiRBCCCEkmeBGhhBCCCGxr1pC0W6fPn2MqgS/pImmqLcYNVeribTKCMHkZTt27HAd69+/v+c5UDymo0+iaqlZs2auemj5v2nTJmPSNVRhaBE4ivCwnbTVfrQSqRePn1cbRqnE8eGnWvITkZqO6WiYqJL0U2Eg9FpK2JcmlZGfJ5FfOybFOw3nPSYojQdMapfp06e7XlepUsUYXRvbDNfNYsWKueqtX7/ecxxoLxpUtRcqVMi4NqJKCqP84noqVKhQwYp30JNVR8vHNStSbyQ/cN7hWNGeu+i1FG1QIkMIIYSQwMKNDCGEEEICCzcyhBBCCIl9G5nPPvvMaI+C7n3osqej3mqdqclOAXXgWh+Lety//vrLUzcrdOvWzSlPnDjRmFl627Ztnte+bNkyV73Zs2dfMBKitvfRdhoI6j11PXSlLFGihBU0TNGXta7dz3XQZMeCNki6HvaLX5ZzRIcIIO5o17r/TDp5v+zlSUH3F55P23wQt52KUKNGDWMf4nqj7RMRk/2Y31xFO0PtEo62OSY7HYE2Mu6QHNrdPVK36n991kMTOFbw/qoj/eK40ffAtIASGUIIIYQEFm5kCCGEEBL7qiV0EdbqHlQhoZipZMmSxnoovtaRIfPmzeuZ4EyfA8WYOhkkqjA6dOjglKtXr24U4aHqS4vLMEItqje0eyom9NIqI5O7sRbLY6LMIKqWIk0qmhQRqUlFpM/hp+rA/tPiU9Nn4gk/986kiKsjxa9vTZGZ4xlUi2MYCa1+w4i6un9xrvrNBb+wGib1lE4uiaoJNBHAaPDxCkZb1m2iw3Nge5ui5ev5GWmoCzz3dddd56r39ddfe5peREOUX0pkCCGEEBJYuJEhhBBCSOyrllCdpEWLqP5Azx8tMkT1TIECBTzLWvSpxZZ4DMWnOnkjisDz5cvnmUxNi11RFaYtxfG78Hq1OBxF4PoYim5RzJorVy5XvRUrVjjl5s2bW0Ej0oiSkaomIlUl+EWJxWMoTsdEnuTC3nYmcbVfVN6koMcGzitcY+IZ9ArSazKuk7o/cS3DNQrV/X6qD72umRJ6lilTxlUPI/jiZ9BLVThy5IinmUEs89tvvxmP+d1H/ObgGehnHAN+0bpxnm3YsMFVD/ts3bp1TpmqJUIIIYSQi4AbGUIIIYQEFm5kCCGEEBL7NjI1a9b0dGcWRo0a5ZSLFi3qmTFau0ijTYvW4aIOUOttUQeL59NRKFHvh26A2k0RdYyoO9TnQ/sek7u5rodl7ZqNukh0o/SKUhwtJMXdNqm2Eya7GD/7Gz/3a1Pm8UjteeIJnI9+EZKT2w0a+0jr8XG+bNmyxSnXqlXLildwjdLzDNc8bQeGayquSbrNcW3ENU/bbOAaiFmt69Sp46o3d+5cz3VYr7VojxMvNjJTp051vc6fP78xmjn2E/bRn8pOFOcntrGuh1GWsW/RjlN/7+rVq61oghIZQgghhAQWbmQIIYQQEvuqJeSpp54yqp3efPNNo8oE3ZZR7aIjQKKYVLtfm1z9/CK5+rkiohrL73wIHtPXjiJYdCPUYkAU22GCN6FLly5WNBJpJF4UV/tFC0W0+6hJzaBF6PpzpuvDa8fzRaqqiif27NljPIbtb3LFTkwEYFPiUD3/UOSNYvd4BiOR63UN19o1a9a4juGcxNAP+hzY5n6mAKjix+SVbdq0cdXDNR/PoaPampJVxjKoLtX3Ea3iMYUW2afqTZkyxSm3bdvWKWfJksVVD1WPOgq0qd7atWutaIISGUIIIYQEFm5kCCGEEBJYuJEhhBBCSOzbyJh02ULr1q09y7NmzTLa1mDWaR2iGvXj2oYBXQf9XEExYyjq6HXmbtTvon4wUrdctAfRNjPanqNFixZOuXLlylEV4jml0G2A9inYZ7oevvYbeyZbJm2XYXIDp/t1QnBO6PAH2K7YdrofIrVDQtdSrKf7GW00MJVIPIMpYPT4RtuJY8eOuY5hO2O4DG37gmlasmXLZvwuE9reAs+H4wjPLezdu9cpX3bZZVY8gDYswpw5c4xzC+eGX4qV7AZ7F7+0On71cF2oXr26FU1QIkMIIYSQwMKNDCGEEEJiX7VkcnP1o1mzZq7Xixcv9qy3fv16o8hUZ6HetWuXUy5VqpRRxaOjCpOLJ1J3ZBRXY8ZbLa7EMaXHF4q58Zi+BnwdaSZfhO7XCalXr55T3rhxo+sYqilQ1KxBcTj2S6RtiuoFPQbiRd1wITALuA4DoV2aTVmRcd3Ubs+4DqM7t84+jvWwrF2KTe71ekyg63G80LNnT9fre++916haQrWhjsYcyT1bhy/AOY3j4cSJE656+LpPnz5WNEGJDCGEEEICCzcyhBBCCImvyL7JTaVKlXxfI9WqVUuFKyIXA4oqdYIyVPlgZFKt4kHPiEjVRH7JINFbDSObavG36RqSql4NIqim6Nq1q+vY7NmznfKhQ4eM6gZUU5i8InQ/Yf+VLl3aqKbWapR4BdW2ZcqUMaqP/MY1er1oVSF6U44ZM8aogmrevLnnufX8wXUB+7Bs2bKuetdcc40V72CEZB35HdFJi5EDBw5YXugIwDhWcD5qFd/06dM9zTqigfhYmQkhhBASk3AjQwghhJDAwo0MIYQQQgJLupBfmmdCkpD9+oknnjBmL8cMuH62L6hfxwiVflmtTa7d2k4DdfXoauwVYTMeibSfEZ3pHfXwGLlbn69w4cKe5Uhdu+PVRV7bqugorH7RsNEuDG0ddu7c6aqn7W5IdDBv3jynvG7dOmMk/SFDhjjlIkWKeK7P2pamU6dOnlH6ox1KZAghhBASWLiRIYQQQkhgoWqJEEIIIYGFEhlCCCGEBBZuZAghhBASWLiRIYQQQkhg4UaGEEIIIYGFGxlCCCGEBBZuZAghhBASWLiRIYQQQkhg4UaGEEIIIYGFGxlCCCGEBBZuZAghhBASWLiRIYQQQkhg4UaGEEIIIYGFGxlCCCGEBBZuZAghhBASWAK5kUmXLp31/PPPO68//fRT+73t27en6XWR1Ef6XPr+zTffTOtLiSs4BwlyMf3fvXt3q3Tp0ilyXSQ++vCS1Gyg8F/mzJmtihUrWg8++KC1f//+1LgEchGsXr3a6tixo1WqVCm774oVK2a1aNHCevfdd9P60kiEcA7GHpyXwYd9mDykt1KRF1980SpTpox15swZa/78+daIESOsadOmWWvWrLGyZs2ampdCImThwoXWNddcY5UsWdLq2bOnVbhwYWvnzp3W4sWLrXfeecd66KGH0voSSSLgHIwNOC+DD/swoBuZVq1aWXXq1LHL99xzj5UvXz7rrbfesiZNmmR17tzZilVOnTplZcuWzQoir7zyipUrVy5ryZIlVu7cuV3HDhw4YMUDp0+fjpmbPOdgbMB5GXzYhzFiI9OsWTP7/23btllNmza1/5JT9zZ8+HCratWqVqZMmayiRYtavXv3to4dO+YcF7F69uzZ7RuVRhZ12SH/+++/znvff/+9ddVVV9kLYo4cOaw2bdpYa9euTXC9cs4tW7ZYrVu3tuvdcccdVlCR3yFtqCeaULBgQacs6gppz4kTJ1rVqlWz21w+98MPPyT43O7du60ePXpYhQoVcup98sknrjr//POP9eyzz1q1a9e2J7u0ubT97NmzL3jNoVDIuvfee62MGTNa48ePd94fPXq0fb4sWbJYefPmtW677Tb7CQiRMSjXv2zZMuvqq6+2NzBPPfWUFatwDsb2vBw1apTdx/Ke9EGVKlVsKZxG+rdt27a2lK5evXq2mqNs2bLW559/nqCutLecU+ZR8eLFrZdfftk6f/58gnqyOZb+kX6X7y5Xrpz10ksvufoznmEfxshGRjpSkKfC5EYMEWXRlA4YPHiwdfPNN1vvv/++dd1111lnz56163Tq1Ml+Uvvuu+9cn5VFdcqUKbbu8tJLL7Xf++KLL+wOlQVy4MCB1oABA6zff//daty4cQLjqHPnzlktW7a0B54Yocp3BxXR3cpNXVQPF0Im0AMPPGBvEN544w1bfSG//fDhw04dscdo0KCB9eOPP9o3MRGhli9f3rr77rutt99+26l34sQJ66OPPrJvrNLe0p8HDx6023XFihXGa5AJJjcymbwTJkywbrrpJufpp2vXrlaFChVsCUTfvn2tn376yd6s4I1VkOsVyUXNmjXtaxLxb6zCORhMIp2XcsOTurIZlz4oUaKEPUffe++9BHU3b95st7fYaEjdPHny2HMJN4r79u2z54PMwf79+9vzSOaazGMvuyzpq0cffdQ+Lg8R8nAinyPsw2QllAqMGjUqJF/1448/hg4ePBjauXNn6Kuvvgrly5cvlCVLltCuXbtCTZo0sf803bp1C5UqVcr1npzrueeeS3D+bdu22a8PHDgQypgxY+i6664L/fvvv069YcOG2fU++eQT+/X58+dDxYoVC918882u83/99dd2vblz59qvT548GcqdO3eoZ8+ernr79u0L5cqVy/W+XK98tn///qFYYMaMGaFLL73U/mvYsGGoX79+oenTp4f++ecfVz35zdLmmzdvdt5buXKl/f67777rvHf33XeHihQpEjp06JDr87fddpvdlqdPn7Zfnzt3LvT333+76hw9ejRUqFChUI8ePZz3pM/lOwYNGhQ6e/ZsqFOnTvaYkmsMs337dvv6X3nlFdf5Vq9eHUqfPr3rfRmDcr6RI0eGYgnOwdgi0nkZnk9Iy5YtQ2XLlnW9J/2L7R3uw0yZMoUee+wx572+ffva9X755RdXPekD7H/Td/fq1SuUNWvW0JkzZ3zHVzzAPkw+UlUic+2111oFChSwd5Ty1C47PXlqFkvt5ESe9kU1ITvNSy75/58oBlU5c+Z0nv5EHXLLLbfYxo5//vmnU2/s2LH2NcmTnjBz5kz7qV1E3YcOHXL+5Emxfv36nuqO+++/34oFZGe/aNEi64YbbrBWrlxpS1rkSVfaZ/LkyQn6V0SPYWrUqGG399atW+3Xcv8bN26c1a5dO7uMbSnnPH78uLV8+XK7rrStqIYEEXkeOXLEfsoW+45wHUT6W/py6tSpdn/KU38YUS/JOW699VbXd4raQiQ0uv9EhHrXXXdZsQjnoBVX81JUB2FkfkmbNWnSxJ6T8hoRlYWo7cLIOLnsssuc+StIP4lEVVQXWM9LdYffffLkSfu75fwibVu/fr0V77APA2rsK6IwcflMnz69bR8hDYyLXHKxY8cO+385PyI3RtEZho+HRduiPpCBc/vtt9uLqXR0r1697EVW2LRpk8ueQCMLMyK/T/SOsULdunXtzYDcmGTCyY1vyJAhtghTxJMyeQSxvteIaPPo0aN2WVRDcjP64IMP7D8v0Mjts88+s8WjMmHCqghBvG40r732mt13YkOh7Tyk/2TjJJsWLzJkyOB6LQtJeBMVa3AOWnE1LxcsWGA999xz9g1T2yHJTVDsz8JcaP4K0m+ycdTofhZEnfHMM89Ys2bNslXF+rsJ+zCQGxnZAYY9JjSyYP2vxNpNShsVyc5UjKS+/vprexEVvfxff/1lL65hwkZQoqOXp3iNLJr6iT4lbg5pjdyEZOLJn9wMRWrxzTff2JNMCNsyaML9Gm7HLl26WN26dfOsK1KcsGGu6Hbbt29vPfHEE7atg5xfNixhuw5EnmTEsFieamQjI4ZuYeR7ZXzJJsfrGkUqYXoKiTU4B624mZcyz5o3b25VqlTJtgsTKZzUlU2i3Cy1ceeF5m9ikAcWkRrIBlNc/kVSK3NSpKlPPvmkp2FpPMM+DNBGxg/ZNaL4Kww+uUWKGEYJGzZssJ/+wsiuV7wzRLyOiMpBDJlkxykibVlUZXENE1aXyM1UfzZeCd8M9+7dG/FnRHwpHiRyY7xQO3777bd238nTSvipXAhvmjTSX/fdd59ttS+qCnmyCd/cpP9kIoskRxYJ4g3nYGzNS9kQ/v3337akC5/UI/H88+vXsHQMkX5G5syZYxvNy/wVg/ow0vfEH/Zh4omaRxZZqESFIOqHMCJqE7FaYpGFTnatQ4cOde1EP/74Y1scJp4PiDz5yWARVYY81cuiqp/2ZVf66quvulQcYfCaYw2ZMF67eXkiMIkjTcjTgniPiJ2Ml6U+tmP4yQK/+5dffrHFq379/tVXX9l9eOeddzpPDOK5JOd74YUXEvwWeY1eVfEM52BszUuvOSRtL+68SUXc2SVg26+//upq+y+//NJVz+u7ZRMr7vjkf2EfxqBERuKKiOhMFixxxRVbiZEjR9p+9lo3F8mT/3/+8x/7xnX99dfbxlSy25QOENGdiOuQK664wnYBfvrpp+3FFEXagiyg4gInN0epK0aS8h1//PGHbbR45ZVXWsOGDbNiEYkuKXrZDh062OJNGcgSkTL81JxYo9jXX3/dnsCioxXDT9EBiyGviCvFQFTKgkhW5ElAvlduevIUIONB6qNRqEZUUTLJxdVa+k3cfeUGLXESZEyIm67UEcmQnFMkNxJz5vHHH7fiHc7B2JqXEupANpNiXC/2RjJvPvzwQ1uqlRhJKtKvXz9bvSd92qdPHzuej9i7yVP+qlWrnHqNGjWyJXyiQn744Ydtqap8LikqjliFfZiMhFKBsGvmkiVLfOuNHj3adikTt82aNWvarmhJcf1EV89KlSqFMmTIYLvt3n///bYLrxdPP/20fY7y5csbr2/27Nm225u4qWXOnDlUrly5UPfu3UNLly516sj1ZsuWLRQrfP/997a7s7Rj9uzZ7b6RNnrooYdC+/fvd+pJ2/Xu3TvB56XvpE0Q+ZzULVGihN03hQsXDjVv3jz0wQcfOHXELffVV1+1Py/ug7Vq1QpNnTo1wXhA92tk+PDh9vuPP/648964ceNCjRs3tvtH/uQ3yXVs2LDBqSPux1WrVg3FGpyDsUWk83Ly5MmhGjVq2G1VunTp0MCBA23Xd91X0r9t2rRJ8D1eLvmrVq2y35Nziuv8Sy+9FPr4448TnHPBggWhBg0a2O79RYsWddyLpZ70Y7S47qYV7MPkI538k5wbI0IIIYSQuLORIYQQQghJLNzIEEIIISSwcCNDCCGEkMDCjQwhhBBCAgs3MoQQQggJLNzIEEIIISSwcCNDCCGEkMCSopF9dYgazJkTKZgNWZAsnGEkwmGY3Llzu+pVrlzZlUAuDGYBFTDkPeZ2kVDoSUkkiL85Kb+XkJTCFDIqqeP0559/TpALKUykmacxb8vSpUudsuTLIoSQSKBEhhBCCCGBhRsZQgghhASWZE9REKlq5dChQ075nXfecR2T5IFhzpw54zomCa7CSJKtMJK1Fzl58qTn92bIkMH1ulixYk65SJEiTvmvv/5y1cubN69TbtKkiSvxFyJJtgiJRsLZwIVLLjE/w+zatcspf/LJJ65jgwcPdsqJTSR5IfCa9DwdOHCgU5ZEd4n9vfr8hJDYgTObEEIIIYGFGxlCCCGEBBZuZAghhBASWFLVRmbLli1OuW3btk65cOHCrnqZM2c26sovvfRST7dqtGER/vzzzwt+RtvZHDx40CmfO3fOVe/vv/92ymfPnnXKWbNmddXr1auXU77ppptcxwhJTSK1EalVq5br9aZNmzzHvR7vWNa2bGgrhqER9u7d66qHtmgY4kCfD+czzvXmzZu76o0ZM8a6WBuheEXfCkzt5Wf76Hc7SYqb/8KFC12vGzVq5JQ3bNjglCtWrHjR3xVrhJI53EKkdOnSxSk/+uijrmNXXHGF59qi78uJhbOZEEIIIYGFGxlCCCGEBJZkVy35ceutt3q6X2uXZVTraDEYqppQ3KlFU/gay6hKEo4fP+6pMvJrFhS56vPh60mTJrmOZc+e3XhOQlIz/EHDhg09I+oKhQoVMo5vPCfOU62qOXXqlOc16QjZ6dOn95x/qF7W4PfiOiLceOONTnnixInGczACd+JUS6ieT27mzJnjer169WpPNaewatUqz+udMWOGq97FqirSmkjHZ1LqaUyfw/mo773YRx07dnTV27hxo+d81HMS15aMGTNaFwMlMoQQQggJLNzIEEIIISSwpKhqSXsodOrUySnnzJnTKJZGcfPp06ddx/7991/PshZ94ms8v/aGwPP7RRbF86GKSH/v4cOHnfJ9993nOnb77be7XhOSmkyYMMHTo65EiRJGlQKqiLQYGst6HuBcwiVGe1KZvlfXw+/CualVUJhkdvz48a5jrVq1suKR5Eje68fnn3/umXh33rx5rnpDhw51ykWLFnXKK1eudNVDDyT0chG6du3qlGvWrGnFA5Gqhf6F+6EG55P2yEV1r59n39y5c51yhw4djGoh9FLEKP06kn5yqncpkSGEEEJIYOFGhhBCCCGBhRsZQgghhASWFLWR+f33312v27dv76kr09FD0W5F697RZcukh9e6PpPLqAbr6fOh3Q6SP39+Y6TSKlWquI7pTMKEJAd+tmKm8Y3jVs8J1HFrGxl0yfSbf/hdSYmi6xeV2M82B9m3b5/RZg+jievfb5rr8Wwjs27dOmN7DRkyxNN+8MiRI656aO/SpEkTz/d1OAAdGgA/h7YZ5cuXT8SvIZGwc+dO1+vKlSs75Rw5chhtcz799FOn3Lp161QJe0CJDCGEEEICCzcyhBBCCAksKSpDxSiMWiSJYl8tRsbX2r0S3fbKlSvnlEuXLu2qhwnt0L0sW7ZsrnroyokqLoxcKEyZMsXzfMeOHTMmt9NieUJSApN6RUfVRJURqgC2b99urKfVQjosQSSun0lBf69JnaTXDpz3eu3ACLK33Xab5/likUhF+DrUBSZsRFVcrly5XPV69OjhqWZC8wGdQBDd5PX1VapUySkvX77cdWzmzJme/RvLqqVIk79q9u/f76nmwxAhwrJlyzw/o1WImKwVxwNGxxfq1KljpTaUyBBCCCEksHAjQwghhJDAkqKqJRTfCldddZVT/vLLL53ymjVrXPWeeuopTzFjYsSi6D2EZa3uwUi/qHbSUXhfe+01p1y3bl2jZwSKtrdu3RrRtROSEixatMh4THsKRiq6NkX21VysM6Q+t8mjUF8relXpKN5LlizxXJtiPWmkVvuZPMBQLa4TL+IarZM8vv/++075hx9+cMotW7Y0XlPBggWNx1DthOoMYffu3Z5eoFdeeaWrXrVq1ax46L8tW7Y45b59+7rqodkDehmtXbvWaK6BnsZNmzZ11TN5GusEnX6ewcntiRmGEhlCCCGEBBZuZAghhBASWLiRIYQQQkhgSVEbmX79+hl1e9dcc41TrlWrlqveiRMnjDYyqB/HDNr58uUzupCiy6jWh+P50I1M2+2gex/a96Abq74OrTuMR5KaudWkx09qFFa/rK6RgvYX+L3RamOBYQJ0VGy/dsM+0+7Wpjbwc7/2c5c2jQ8/vTiOAe1ijbp7HWphzJgxTnnw4MFWvODnyu43XrBvZs2a5ZS7dOniqjdy5EgrOUH3YLwXCLVr1/aM7KttvvAc+t4QNEwhD3QIkk8hom5y/O4CBQq4XqPNGdogderUyWhz47eu47FII+mboESGEEIIIYGFGxlCCCGEBJYUTRr5008/GV8fOnTIKc+YMcNVr1u3bp5JwrT6Z/PmzUbXQZM6AkXjWjyJYq+qVau66qH72jfffGNUH+XJk8cpjx8/3hgpU7sVxjvJnbhv+PDhrtcvv/yyU96zZ48Vq6xcudIpN2zY0HUMI7KiWFdH5kSRtFbdoHgZRd56XqFqyC8ZqymJnF8SWJynepxgZFI9N3EO64R4JOlgeAscL5G65+t6kyZNMqomUJWCpgWYEFRfh05KGS+chzmD7einqkJuvfVW1+tx48ZF5Fo/bdo062JJrGqQEhlCCCGEBBZuZAghhBASWLiRIYQQQkhgSVH36/79+7u/DPTZ6KJVuXJlV73Jkyc75RdffNF4ftT1aX24SUevdeom+xmdygDduevXr++ZBVS7leuMrLSLMevGI7WJQRdaYcWKFZ62S9q2A10JO3fu7JT/+9//Rnzt6L78xhtvOOVnnnnGihZwPGtXZwRtyrR7LvaRtl3CY3h+bdOCOnk8v5/7tZ/LtametqHANUH/rl27dhnPTxISaR8ieCypWcUPHjxoDG9hGn/aRvJibeyCSEjNQVxf/exicI5ju3Xt2tVVD9dX/C60VdU2U9qlH8F0CL179zamQxg9erR1ISiRIYQQQkhg4UaGEEIIIYElReVvHTp0MLpfL1u2zCm3atXKVe+GG27wzIQqlCxZ0lP0qd0/UbzlF3UURWmYuVqL4k6ePOmUd+zY4ZSHDBniqofHdJZYjGCsoxnHEn6ulSaXzE2bNhnFmJjFWbvqly1b1ikXL17c09VW2L59+0W7B3711VdO+ZdffrGikeXLl3uqwvzcmzEEgRYHaxWrSUSt+9UUmVmre3Bu+kVwNs1h/T7Oex2ZFNUU2H+oKibWBVVD+n0cL35rrd+6gOCY++yzz1zH2rZt65Rvv/12owrKT6URq6RLYoRxU6RzbGsdWgQza6MbvL7PlyhRwndPEObo0aO+JgQXghIZQgghhAQWbmQIIYQQElhSVLW0bt0612tU3aC3T4MGDVz1FixY4JRXr15tFJ/5Wc9jPb+IoZFY6evrRZFmzZo1XfXKlCljFKtddtllVrTjl1wRVRVaHRGpiBNFkk899ZRTHjt2rKseJvwrUqSIU65Xr56rHqoUT58+bUw2unv3bqc8YMAA4/WhKlNf06OPPuqU169f76km1YntUhsc33qso0og0uie+hz4OYzyq9UNJpVRpIHE9RjCpIAYoVh7q6BKSv9GPMfbb7+dJM+1IHqspCZ+HmWmehqM5KpV8EuXLnXKvXr1cspbtmxx1WvUqJEVD0Sqrgv5rAuRjhW8n6GpxZEjR1z12rVrZzxHoUKFPOcnevvqNT8SKJEhhBBCSGDhRoYQQgghgYUbGUIIIYQElhS1kdF6S9SZYvZZHR3Xzw0a3exQ16cjOZrsXbQ+EM+BNhb6e9F2Aq9P6+jRFgPtQYR9+/Z5ug2nNX76U8TPLsbkfocZU7VbHUY61tnGsT8xO/OJEyeMbpZoV4O6dD3GvvzyS6c8aNAg4/mqV69utLFA+xDt6p2WaDdUxJQBV/crjgE/OwfEz14tUvxcwnEu4RzWLuYYgVtfE54T+y8WSCubGD8ijeyL0bmFyy+/3DMKtzB16lSnPH36dOM40PaJsUpS+v0Sg7v1hVi5cqVTrlGjhjHzOIap0Ov1s88+63nvbNGihXUxUCJDCCGEkMDCjQwhhBBCAkuKqpa0mgIT+aHqQIvmUcWjxWAoLkaxt/4ukxuxrmdKhqZFlXgsf/78lgl0RdPRSffs2ROVqiUUT0YqDh46dKhTHjFihOvY/v37jSLeatWqeY4B/Izf9fmpBrEvdVRXLeI0uWlOmDDBeB0vv/yyU37vvfeccqlSpVz1MMmZThya0rz66qtG9Si+RjWZdp9E99dI3aWTA5zPWrWE4xKvXUf0RtUariNaJTxx4sSoc12OBbAP/daSgQMHGsfffffd55S/+OIL49hs3bq1Z+TuxKjB49E1+5y6L5kSLOt5gYmZ8Z6dmDXilVde8byn3nLLLdbFQIkMIYQQQgILNzKEEEIICSwpqlrSXgMmNQAmo9KJ3/xUS34i4Egj+5rE7Vr8ht+L0QlRXabFdPocGA0xWhILCjNnznTKGzZsMHp2oGoMfwt6iujkjehxpNtYHzOpAbAd/VSDqGbQ4wa9kbDPdPJHjCipEyYWK1bMKVesWNGowvjwww89ReipwdatWz1FwbrtUXWqVWP4e1JTtYT4zVMce1q15Bf5G9UepUuX9vwMuThw/dPqnueff95zThcsWNBVDz0dK1So4DqG/Y3rUVBUSTiucXz6zTO9liXV68j0edP4r1Onjus1Rt9FjzE/tIkGzkFcd/zMNSKBEhlCCCGEBBZuZAghhBASWLiRIYQQQkhgSVEbGQ3qRVEvpyP7apsDEyabG/1dqIvUenN8HWnmVrQ98HP79os2nNoMGzbMKY8fP95ok+QXXRX10xhFV7cBRmzU/YK2L2hbo+2JcHygrY7+LrT7wLbH36TPgXpbzKSsx4C23UI7DTx/Wts+YTRpvC6tdzZFrtZ95JcF3uTSqV1ttW7cBJ4fz+Hn+om2VXqMov2T7hecj3/88YcVBPSaEWl4hOT+buwP3bc4p9etW+eUn3jiCVc9tCvDyO6DBw921fOzWcIowGgP1rBhQys18XPZ98tInZRQF8nNJT42NjfddJNn9F5h1KhRnp/R91Q8v17X0e5QZza/GCiRIYQQQkhg4UaGEEIIIYElRVVLkbo1ahG+Fkchpii9Wo1jctP2uyY8hxbp4neh+F67HqOqQ5OWieruvPNOp1y3bl3XsQULFjjlNWvWOOUdO3a46qGo/ujRo0YXWGxHLXbE5JuHDh2KSL2Bomz9XSa3RZ08EVVhqI7Q4l0cH9q1Hq8DxenazblNmzZWajJv3jzP9/3UPaha0r8TI61q1Y1JNB5pKISkgm2MfanHDao19TqCvzM5klymBn7qBz+X3eRoc5OqHce+Vm2+9dZbTrlZs2auehjq4JtvvknSNeHv8rumlMYvwnhS2n79+vWu15988olRRaejlkei4sF7j57vzzzzjFM+ePCg0QQhKaoqv/Ap5cqVM34use1JiQwhhBBCAgs3MoQQQggJLKnqtRQpKAbTolVTZEQ/UbGfaMqUNFKrC44dO+apWtKRJ9GqXovl0ypKqv5uTNwo1K9f3/MzWk22bds2p7x582ZjBE+MuKnVaab+0yJITA6HCcrwfa3aQw8krfJD0bOfGBrVL379hR5BqOpIi0ixOjmkaQybIoni2NYiez+VrWnu6Nd4fX5tit+r29CkCtO/HVWeWj2sf0vQSe5x5ueJ46fiwoi9RYsWdcqrVq1y1Rs7duxFXyOOOVRNp0ZkX1Rr+0UYx3GGahvho48+MnrrmtbaSZMmuY5h9HXTNehrxDmDHmNazTdt2jTLBN73MFK6n0oL56MeU40bNzZ+F1VLhBBCCIkbuJEhhBBCSGDhRoYQQgghgSVFlcZo26BdI/1sWlAXp3XgqKv1c/syRVrUuk2Tq7effQtee8mSJV31li5darRRSMvIvmgzorM67927NyIbhrx58zrlpk2bGu1gTDYbfnYQejzgOU2u2FpvjZ/BsabdCv2yJ+O167GBkXFxbGvbC8zqWr16dSuladKkief7Wrds0uPrtsc28LOzwfPrtsLXqE/X7W1y8dXnw2vyizyM50+ryKmpZbeCtk379+83zmmcq8lhc/Pcc8+5XuNYQruYCRMmRHQ+v3AbftHR0UYmNfBb10wsX77c9Rr7yW/9w4zgGLJCmDJlilNu165dovuzc+fOrtfXX399RC7ROI8jZd++fa7XaE/YqFEjK7mgRIYQQgghgYUbGUIIIYQElmRXLaHo3y/6Yc6cOY3nQPGwn8sknt9PZB2py6ef2sokRi9durTx2v3E3mmJdhfWryNR+fmJ8FGto124TW2g1W6mZJ5+n8M+0mrNYsWKeY4HLdb2+12msaLbD11QU4PvvvsuIvUovkZVW6FChYz19NwxjW/dVqiSMqmjdJv61cN+8ovQa+ojr9dBwE/d8/vvvxtdanF91Ul4kxIFF6P3Lly40HUMVbqmKNN++KlA/eqmduLPuXPnGr+7Y8eOnuMTVXwaDBeho9ujGkevL3369IlItYTceOONTnnt2rWuY9q9OznBBK+JGXuJDVVCiQwhhBBCAgs3MoQQQggJLMmuWvJL0IhiaRT1JybCp0nsqEVRJk8l/XlTdFL9vajiQq8XHdnXT7WUlpF9kwMUd/pZsGsxKUlZfvjhB8/3tVoW1T04hkeMGOGqd8cddxhVgZiME8e3VmPhMb/5bPqM9oTD1yiu1h5bmOhUR3c2oT1+tKotuUhKYkE/r6Xk9Pq4ED179nTKGzdudB2bOnXqRZ3bL3q73xjRiRZTmq1btzrlXr16uY4NGDDAc46gSk4fQy8orRrEz/klXuzXr59Tvueee1z1nnzySac8e/Zsp3zttde66ulo6cmJVq1plX9yRa2mRIYQQgghgYUbGUIIIYQEFm5kCCGEEBJYUjSyr9ZzoW7Pz0U10sidJtdNr88lNsOrn54WdfRVq1Z1HfPLyB10GxkSnaCLO+qgtdutaU506NDB9frhhx92ymPGjHEdQ9uaI0eOOOUiRYoYr8nPHgLnH9oM6MjM+DnM1o6uqMLPP//seW6v7w4zefJkoz1IWmer9vsMrietW7c22lj079/fdez222+P6LtffPFFTzusvn37uuqlRvRqrzVfZ1ZOabp37+6UP/jgA6MrPF6XnnOY8RrHuM5Anz9/fqO9GPb7oEGDPMtCgQIFPG0aX3jhBcuEKbt9UtG/K1K7tcR+NyUyhBBCCAks3MgQQgghJLCkqmoJRWKYWE+DbqIoHtOic79InaakeH7JKvH6tGjclJDQz41cX59fcjRCkmOeoeonUjGu5vXXX/cs+6HF33gdfm7H+BpduP0if0eKX1RijL6KSfhSUrU0Z84co7s6rmuYnFVHdcW1EX8DloXNmzc75cGDB7uOofstJiecMWOGq94777zjmXgy0jGRVPzUabh+64SmqYmO6L548WLPRMI6yS26+uNvQbdsff/xaw8MdZHJpz1QpeWnCkyK+lPfK1GNpSP7mkIb6PVDj+cLQYkMIYQQQgILNzKEEEIICSzcyBBCCCEksCS7jYwpNYDGL1Qx6ty07gxdNA8fPmwMxx6pKzWCOkutoz916pRn2GWty8Nr1zYxWl9KSHLw8ccfO+Xx48d7jtmUcK1E9DxIrI47JWwXMMO3thnCdeXKK69MlWvbvn27Z1k4cOCAp30RrnfaJgLXuBIlSrjqdenSxSnXqFHDdezHH3/0zGS9evVqV73GjRt72tlo+x5c81LabgXtL1q2bGmlFf/5z39cr//73/96phvQ9x687+E9Rrcb2qro+wjaeuH5zyv7TxxHOoxCcq4LfvdXff822cj42a5GAiUyhBBCCAks3MgQQgghJLCkT8nIi1oEGam6p2PHjk75xIkTrmPojo3f5eeKjfX8smSjWE2rqnLlyuWU69SpY/wuFAXra8LrICS5QJUJZn/W2ZFxLkUa3dUPv7AGfpnkEdMxvyz1fu7c119/vVP+6KOPXMcwbEKbNm08swSnVmTYSEH1ubBr1y7PyMr4vm4jHBNanYRjQkcHxjGiVVdIarpBo2rprbfe8sw+nRpoF2Zsb4yC/Oyzz7rqLVmyxHhvS26uuuoqp3zNNdek2Pf4qaNwrPlF9E+K27frGi7q04QQQgghaQg3MoQQQggJLMmuWvrrr78iEjfrZFJ+FuFBAkVk+vf7/WZCkgO/qKLoxaBVEQh6O+nIsiaRcnJ7QfmBKlqtAq5Zs6bxGKqWHnzwQSsI5MuXz/d1vIFeadHah6jexLJm48aNTnnZsmWuY6tWrfJMAKpVini/KaaizI8cOdLze7V5xcXOXT/VYr9+/VyvL7vsMs962gwlsVAiQwghhJDAwo0MIYQQQgILNzKEEEIICSzJbiODmVsrVqzoOoYufPXr1zeew881+2LdtFIadFnctm2b61jt2rXT4IpIPIFzZ9CgQca5WaRIEeM50jKrcCT4rQEYngFddfXvSk2bHpIyvPTSS1aQwfujvld27tw5xb43XTLfQ/3Oh5nW/fALnxIJnM2EEEIICSzcyBBCCCEksKQLRZpRkRBCCCEkyqBEhhBCCCGBhRsZQgghhAQWbmQIIYQQEli4kSGEEEJIYOFGhhBCCCGBhRsZQgghhAQWbmQIIYQQEli4kSGEEEJIYOFGhhBCCCGBhRsZQgghhAQWbmQIIYQQEli4kSGEEEJIYOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 30
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "从数据集到Dataloader",
   "id": "c6ff7afc4eefbbff"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:00.273125Z",
     "start_time": "2025-03-09T06:50:00.270907Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# DataLoader 主要用于将数据集（如 train_ds 和 test_ds）封装成一个可迭代的对象，以便在训练和验证过程中按批次加载数据。\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True) #batch_size分批（每批32个样本）降低内存消耗，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "id": "8e66429fdc3ea411",
   "outputs": [],
   "execution_count": 31
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "id": "506773184e6bb8a1"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "测试一下数据集通过DataLoader封装成什么样的可迭代对象：",
   "id": "24633400b44f282f"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.718899Z",
     "start_time": "2025-03-09T06:50:00.274156Z"
    }
   },
   "cell_type": "code",
   "source": [
    "i = 0\n",
    "for datas,labels in train_loader:  # 每次迭代返回一个批次的数据\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    i += 1\n",
    "print(i)  # 打印了训练集的批次数量，每个批次32个样本，一共60000/32=1875次"
   ],
   "id": "552f56106dbd031b",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "1875\n"
     ]
    }
   ],
   "execution_count": 32
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "定义模型",
   "id": "41dca01b651761f9"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.724502Z",
     "start_time": "2025-03-09T06:50:03.720164Z"
    }
   },
   "cell_type": "code",
   "source": [
    "class NeuralNetwork(nn.Module):  # 在pytorch框架下开发模型都会继承nn.Module类\n",
    "    def __init__(self):\n",
    "        super(NeuralNetwork, self).__init__()  # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层，将输入数据变成一维\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(784, 300),  # 784是输入特征数，300是输出数的特征数\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(300, 100),  # 300是输入特征数，100是输出数的特征数 隐藏层神经元个数为100\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(100, 10),  # 100是输入特征数，10是输出数的特征数 输出层神经元个数为10，对应10个类别\n",
    "        )\n",
    "\n",
    "    def forward(self, x):  # 前向传播,重写了父类的forward方法   \n",
    "        '''\n",
    "        全连接层（nn.Linear）要求输入是一个二维张量，其形状为 [batch_size, in_features]，其中 batch_size 表示批量大小，in_features 表示每个样本的特征数量。而在处理图像数据时，输入数据通常是四维张量，形状为 [batch_size, channels, height, width]。以手写数字识别为例，输入的图像数据形状可能是 [batch_size, 1, 28, 28]，这里 1 是通道数（灰度图像只有一个通道），28 和 28 分别是图像的高度和宽度。全连接层无法直接处理这种四维的图像数据，因此需要将其 “展平” 为二维张量。通过 nn.Flatten() 操作，会把图像的每个样本从 [1, 28, 28] 展平成长度为 28 * 28 = 784 的一维向量，最终输入数据的形状变为 [batch_size, 784]，这样就可以作为全连接层的输入了。\n",
    "        :param x: \n",
    "        :return: \n",
    "        '''\n",
    "        x = self.flatten(x)  # 展平层 展平后才能输入全连接层\n",
    "        # print(f\"展平后x的形状：{x.shape}\")\n",
    "        logits = self.linear_relu_stack(x)  # 全连接层   x会按照 nn.Sequential 容器中各层的顺序依次通过每一层进行处理\n",
    "        return logits  # 没有经过softmax,称为logits\n",
    "model = NeuralNetwork()  # 实例化模型对象"
   ],
   "id": "820677e75e428085",
   "outputs": [],
   "execution_count": 33
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "看一下模型结构：",
   "id": "721559a1f0b498c9"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.728851Z",
     "start_time": "2025-03-09T06:50:03.725296Z"
    }
   },
   "cell_type": "code",
   "source": "model  # 打印模型结构（之所以具备这个功能是因为继承了nn.Module类里面的__str__方法）",
   "id": "40323dfca0d00333",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.733982Z",
     "start_time": "2025-03-09T06:50:03.729628Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#为了查看模型运算的tensor尺寸\n",
    "x = torch.randn(32, 1, 28, 28)  # 随机生成32张1通道28*28的图片\n",
    "print(type(x))\n",
    "print(x.shape)\n",
    "logits = model(x)  # 像函数一样调用实例对象等同于就是调用call方法而call方法再调用forward方法\n",
    "print(logits.shape)"
   ],
   "id": "4dd87b039ebbae27",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'torch.Tensor'>\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32, 10])\n"
     ]
    }
   ],
   "execution_count": 35
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.736904Z",
     "start_time": "2025-03-09T06:50:03.734769Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for name, param in model.named_parameters(): # 打印模型参数\n",
    "      print(name, param.shape)"
   ],
   "id": "61592b2bdf1eaf1a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.740035Z",
     "start_time": "2025-03-09T06:50:03.737719Z"
    }
   },
   "cell_type": "code",
   "source": [
    "for p in model.parameters():\n",
    "    print(p.shape)"
   ],
   "id": "28f014623c4bbe0f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([300, 784])\n",
      "torch.Size([300])\n",
      "torch.Size([100, 300])\n",
      "torch.Size([100])\n",
      "torch.Size([10, 100])\n",
      "torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 37
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "计算模型的总参数量：",
   "id": "4ad1a9bb5aec58c7"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.744031Z",
     "start_time": "2025-03-09T06:50:03.741470Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# model.parameters() 是 nn.Module 类提供的一个方法，它会返回一个迭代器，该迭代器会遍历模型中所有需要学习的参数（即权重和偏置）。这些参数以张量（Tensor）的形式存在。\n",
    "# p 代表从 model.parameters() 迭代器中取出的每个张量（即模型的每个参数）。numel() 是 PyTorch 张量对象的一个方法，用于计算该张量中元素的总数。\n",
    "\"\"\"\n",
    "如果 p 是一个标量（即 0 维张量），p.numel() 会返回 1。\n",
    "如果 p 是一个一维张量，p.numel() 会返回该张量的长度。\n",
    "如果 p 是一个二维张量（如矩阵），p.numel() 会返回矩阵中元素的总数，即行数乘以列数。\n",
    "对于更高维度的张量，p.numel() 同样会返回张量中所有元素的总数。\n",
    "\"\"\"\n",
    "# 这是一个生成器表达式，它会遍历 model.parameters() 迭代器中的每个参数张量 p，并计算每个张量的元素数量 p.numel()。生成器表达式是一种惰性求值的方式，它不会一次性生成所有结果，而是在需要时逐个生成。\n",
    "total_params = sum(p.numel() for p in model.parameters())  # p. numel()返回张量元素个数\n",
    "print(f\"Total number of parameters: {total_params:,}\")"
   ],
   "id": "ac8df9cb0303bac3",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total number of parameters: 266,610\n"
     ]
    }
   ],
   "execution_count": 38
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "### 1. nn.Module 类的设计理念\n",
    "在 PyTorch 里，所有的神经网络模型都继承自 nn.Module 类。nn.Module 类是 PyTorch 中构建神经网络的基础类，它提供了一系列用于管理和操作模型参数的方法和属性。在模型定义时，像 nn.Linear、nn.Conv2d 等层都是 nn.Module 的子类，当把这些层添加到自定义模型中时，它们的参数会被自动注册到 nn.Module 的参数管理体系中。\n",
    "### 2. parameters() 方法的实现\n",
    "parameters() 是 nn.Module 类提供的一个方法，其核心功能是返回一个迭代器，该迭代器会遍历模型中所有需要学习的参数。这些参数主要包括权重（weights）和偏置（biases），它们以 torch.Tensor 对象的形式存在。\n",
    "在 nn.Module 内部，它会维护一个参数列表，当你在自定义模型的 __init__ 方法中定义层时，这些层的参数会被添加到这个列表里。parameters() 方法就是通过遍历这个内部的参数列表来返回参数迭代器的。\n",
    "### 3. list(model.parameters()) 的工作原理\n",
    "model.parameters() 返回的是一个迭代器，迭代器是一种惰性求值的对象，它不会一次性生成所有的元素，而是在需要时逐个生成。而 list() 是 Python 的内置函数，它可以将一个可迭代对象（如迭代器）转换为一个列表。当你使用 list(model.parameters()) 时，Python 会调用 model.parameters() 迭代器的 __next__ 方法，逐个获取迭代器中的元素（即模型的参数），并将这些元素存储在一个列表中。"
   ],
   "id": "2b2fc481bd144f3c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.753852Z",
     "start_time": "2025-03-09T06:50:03.744666Z"
    }
   },
   "cell_type": "code",
   "source": "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,requires_grad=True",
   "id": "e598e32ab69aa21b",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[-0.0203,  0.0207, -0.0316,  ...,  0.0116,  0.0048,  0.0240],\n",
       "         [-0.0053,  0.0040,  0.0098,  ...,  0.0066, -0.0266, -0.0178],\n",
       "         [ 0.0085, -0.0158, -0.0191,  ..., -0.0167, -0.0221, -0.0131],\n",
       "         ...,\n",
       "         [-0.0142, -0.0147,  0.0220,  ...,  0.0119, -0.0160,  0.0102],\n",
       "         [ 0.0282,  0.0127, -0.0090,  ..., -0.0235,  0.0151, -0.0275],\n",
       "         [-0.0208, -0.0006,  0.0167,  ..., -0.0205,  0.0116,  0.0031]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-3.1387e-03,  1.5693e-02,  2.5695e-02, -1.4948e-02,  1.3891e-02,\n",
       "          3.5145e-02, -3.4832e-02,  1.6405e-02,  7.6161e-03,  7.6131e-04,\n",
       "          8.6990e-03, -1.6637e-02, -1.1289e-02,  2.7855e-02,  1.5884e-02,\n",
       "          7.3439e-03, -1.5683e-03,  3.0588e-02,  2.6749e-02, -3.4336e-02,\n",
       "          3.4458e-02,  1.0196e-02, -2.1344e-02,  2.3260e-02,  2.0422e-02,\n",
       "          7.3353e-04,  3.2740e-03, -1.2234e-02, -2.0850e-02,  2.6116e-02,\n",
       "         -1.7934e-03, -8.5914e-03, -1.3574e-02,  1.8185e-02, -1.2608e-02,\n",
       "          1.6396e-02,  7.5330e-03,  2.1552e-02, -7.6309e-04, -1.0680e-02,\n",
       "          3.2502e-02,  2.8870e-02,  2.0119e-03,  3.0196e-02, -1.9428e-02,\n",
       "         -3.5588e-02, -1.7972e-02,  1.4682e-03, -1.6408e-02,  2.8278e-02,\n",
       "          2.2341e-03,  3.4218e-02,  3.3678e-03, -1.7568e-02, -1.2823e-02,\n",
       "         -2.8884e-02, -2.5996e-02, -4.1491e-03,  3.2235e-03, -4.2440e-03,\n",
       "          1.7169e-02, -8.6194e-03,  1.2591e-02, -3.3872e-02,  2.6017e-02,\n",
       "          4.8146e-03, -2.4781e-02,  2.4233e-03,  2.3656e-02, -1.3600e-02,\n",
       "         -8.9605e-03,  1.3055e-02,  2.7020e-02,  1.4207e-02,  1.5994e-02,\n",
       "          2.1033e-02, -1.1450e-02,  5.6360e-05,  3.2838e-02,  4.6640e-03,\n",
       "          2.6653e-02,  1.7565e-02,  2.8973e-02,  1.7866e-02,  2.9315e-02,\n",
       "         -1.5254e-02,  1.6575e-02,  4.4148e-03,  7.2874e-03,  1.4377e-02,\n",
       "         -1.8903e-04, -9.9184e-03, -1.7086e-02,  7.0877e-03,  2.7205e-02,\n",
       "         -3.1987e-02,  1.7113e-02,  2.8002e-02,  1.9650e-02,  3.5563e-02,\n",
       "          1.9612e-02,  3.3248e-02,  3.5649e-02,  2.4857e-02,  3.2913e-02,\n",
       "          1.7639e-02,  8.9223e-03, -3.2279e-03, -5.8108e-03, -8.1030e-04,\n",
       "         -1.9525e-04,  2.0598e-02,  1.3060e-02,  4.7615e-03, -1.8584e-02,\n",
       "          2.4132e-02,  2.6511e-03, -9.1403e-03,  2.5769e-02, -2.4230e-02,\n",
       "          5.8543e-04, -3.0439e-02, -2.4332e-02, -2.8919e-02,  8.5179e-03,\n",
       "         -2.5458e-02, -1.4178e-03, -2.8145e-03, -1.2285e-02,  1.3399e-02,\n",
       "         -8.9381e-03, -2.9012e-02, -8.9499e-03, -2.5066e-02,  1.7182e-02,\n",
       "         -1.7886e-02, -3.2604e-02,  3.3698e-02,  3.5653e-02,  3.8292e-03,\n",
       "         -8.0754e-03,  3.3100e-02,  9.1949e-03,  3.3834e-02,  2.4404e-02,\n",
       "         -2.5712e-03,  8.7089e-03,  3.2667e-02, -1.6068e-02,  2.5001e-02,\n",
       "         -1.0715e-02, -2.1417e-02,  9.5020e-03, -1.1102e-02, -2.8943e-02,\n",
       "          1.3855e-02,  4.1154e-03,  1.4138e-02,  2.3957e-03, -1.6165e-02,\n",
       "         -2.9328e-02,  1.9780e-02,  1.8490e-02, -3.2372e-02, -3.5097e-02,\n",
       "         -2.9167e-02, -3.0194e-02, -1.7271e-02, -2.9645e-02,  2.3342e-02,\n",
       "         -1.2737e-02, -2.3842e-02, -2.1896e-02, -1.3960e-02, -5.7947e-03,\n",
       "          3.4817e-02,  1.7351e-02,  1.6920e-02,  1.4669e-03,  8.2081e-03,\n",
       "         -4.0625e-03, -1.4140e-02, -5.5907e-03,  1.4956e-02,  2.9693e-02,\n",
       "          7.8302e-03, -1.9695e-02,  1.9595e-02, -6.4686e-04,  1.1348e-02,\n",
       "          1.9658e-02, -2.3823e-02, -3.3708e-02,  3.0800e-02, -1.2200e-02,\n",
       "         -1.7810e-02,  1.1407e-02,  3.4982e-02,  2.7436e-02, -1.6402e-02,\n",
       "          1.1998e-02,  1.9523e-02, -3.2921e-02,  3.5931e-03,  1.0236e-02,\n",
       "          1.4528e-02, -5.4759e-03, -2.6457e-02, -7.8479e-03, -1.5853e-04,\n",
       "         -4.4775e-04, -3.1339e-02, -1.7955e-02,  1.9972e-02, -1.8157e-02,\n",
       "         -3.0428e-02,  7.8954e-03,  1.3467e-02,  2.1529e-02,  6.3726e-03,\n",
       "         -1.6962e-02, -1.9488e-02,  1.9693e-02,  7.3261e-03,  2.5457e-02,\n",
       "          3.3346e-02, -1.3642e-02, -1.8060e-02, -6.5970e-03, -2.9708e-02,\n",
       "          2.9787e-02, -1.9411e-03,  1.2262e-03,  1.9592e-02,  2.9904e-02,\n",
       "          2.5606e-02,  6.1655e-03,  1.9094e-02, -8.3575e-03,  1.4842e-02,\n",
       "          1.7445e-02, -2.1132e-02,  6.6720e-03,  1.8355e-02,  1.4337e-02,\n",
       "          3.4435e-02, -1.4969e-02, -3.1233e-02, -6.2952e-03,  2.1193e-02,\n",
       "          1.6620e-02,  1.6284e-02,  1.3122e-02, -2.9524e-02, -2.3042e-02,\n",
       "          3.2027e-02,  2.4802e-02, -2.9140e-02,  2.6383e-02, -8.7187e-03,\n",
       "          1.4311e-02,  3.2542e-02, -1.3307e-02, -2.0247e-02, -3.4277e-02,\n",
       "          3.5488e-02,  1.6091e-02, -2.7590e-03, -2.0571e-02, -2.0886e-02,\n",
       "          1.3498e-02, -2.1551e-02, -2.2678e-02, -2.4983e-02, -6.5223e-03,\n",
       "         -8.1804e-03,  2.4294e-02,  2.3732e-02,  1.7061e-02, -2.2484e-02,\n",
       "          1.6328e-02, -1.2937e-02, -1.4830e-02,  2.9980e-02,  2.8778e-02,\n",
       "          1.0656e-02,  6.6206e-03, -3.9980e-03, -1.1698e-02, -3.1015e-03,\n",
       "         -3.4690e-02,  2.2414e-02, -7.4462e-03, -5.7405e-03, -7.3415e-04,\n",
       "         -1.7136e-02,  3.4834e-02,  1.6856e-02,  5.0336e-03,  2.3083e-02],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-0.0354, -0.0309, -0.0048,  ...,  0.0301, -0.0526,  0.0434],\n",
       "         [ 0.0357, -0.0529, -0.0506,  ..., -0.0239,  0.0391,  0.0115],\n",
       "         [-0.0446,  0.0543,  0.0400,  ..., -0.0276,  0.0359, -0.0071],\n",
       "         ...,\n",
       "         [-0.0147,  0.0126,  0.0233,  ..., -0.0386,  0.0259, -0.0568],\n",
       "         [-0.0152, -0.0015,  0.0149,  ...,  0.0061,  0.0400,  0.0322],\n",
       "         [-0.0049, -0.0573,  0.0212,  ...,  0.0099,  0.0280,  0.0551]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0168,  0.0098, -0.0274, -0.0347,  0.0386, -0.0405, -0.0117,  0.0567,\n",
       "         -0.0323,  0.0573,  0.0173,  0.0300,  0.0099, -0.0184, -0.0023, -0.0480,\n",
       "         -0.0087,  0.0123,  0.0091, -0.0380, -0.0098,  0.0147, -0.0380, -0.0198,\n",
       "         -0.0267, -0.0340,  0.0204,  0.0020, -0.0344,  0.0294, -0.0162, -0.0246,\n",
       "         -0.0271, -0.0549, -0.0495,  0.0251, -0.0124,  0.0185,  0.0344, -0.0470,\n",
       "         -0.0344, -0.0174,  0.0531,  0.0049, -0.0434,  0.0026,  0.0185,  0.0414,\n",
       "          0.0110,  0.0106,  0.0101, -0.0142,  0.0199, -0.0163, -0.0450,  0.0550,\n",
       "         -0.0015,  0.0296,  0.0313,  0.0323, -0.0439, -0.0080,  0.0516, -0.0250,\n",
       "         -0.0335, -0.0256, -0.0322, -0.0519,  0.0572,  0.0478, -0.0152,  0.0302,\n",
       "         -0.0548,  0.0063,  0.0148,  0.0375, -0.0018,  0.0351,  0.0131,  0.0416,\n",
       "         -0.0272,  0.0250,  0.0442,  0.0250, -0.0144, -0.0219, -0.0230,  0.0480,\n",
       "         -0.0556, -0.0306,  0.0474, -0.0263,  0.0361, -0.0097,  0.0267, -0.0119,\n",
       "         -0.0140,  0.0329, -0.0430,  0.0368], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[-9.7946e-02, -3.8459e-02, -2.7732e-02, -8.2941e-02, -4.9505e-02,\n",
       "           6.7257e-02, -8.9160e-02,  9.8725e-02, -5.5251e-02, -4.4617e-02,\n",
       "           7.9985e-02, -1.0024e-02,  9.1656e-02, -5.5317e-03, -2.2675e-02,\n",
       "          -9.5280e-02, -5.8318e-02,  8.6428e-02, -1.7723e-02,  1.8202e-02,\n",
       "           2.1641e-03,  8.3370e-02,  6.6810e-02, -3.3671e-02, -5.7199e-02,\n",
       "          -2.6261e-02,  8.2337e-03,  1.0814e-02, -1.6567e-02, -9.4982e-02,\n",
       "           3.8369e-02, -7.1046e-02,  6.3110e-02, -3.9486e-02,  8.8677e-05,\n",
       "           3.6901e-03, -8.0158e-03,  6.9814e-02, -3.8205e-02,  7.1887e-02,\n",
       "          -4.4814e-02, -5.8858e-02, -7.6726e-02, -1.2213e-02,  1.6066e-02,\n",
       "          -3.8126e-02, -8.3658e-02, -1.6709e-02, -3.9822e-02, -2.4604e-02,\n",
       "          -1.9057e-02, -2.4016e-02, -9.8433e-02,  8.7842e-02,  6.3963e-02,\n",
       "          -1.0466e-02, -9.1548e-02, -4.2745e-02,  9.2355e-02, -5.5269e-02,\n",
       "           1.9022e-02,  3.7328e-02,  5.0500e-02,  2.6376e-02, -1.4930e-02,\n",
       "          -8.1575e-02,  9.6906e-02,  6.8564e-02,  8.5010e-03,  3.4860e-02,\n",
       "          -6.5739e-02,  8.4420e-02,  9.0342e-02,  1.9927e-02, -9.7201e-02,\n",
       "          -3.7503e-02,  9.1190e-02,  2.9666e-02,  1.0304e-02, -3.7498e-02,\n",
       "           2.3588e-02, -7.7754e-02, -1.2345e-02, -8.2658e-02, -3.5831e-02,\n",
       "          -4.5268e-02, -6.7704e-02,  9.4294e-02,  1.3222e-02, -8.2805e-02,\n",
       "          -6.8765e-02,  3.5524e-02, -2.3947e-02, -1.2473e-02,  9.0406e-02,\n",
       "           9.6133e-02,  1.9308e-02, -9.7334e-02,  5.0160e-02, -1.9754e-02],\n",
       "         [-3.8325e-02,  3.2300e-02,  1.2585e-02, -9.9851e-02, -7.7139e-02,\n",
       "           1.1431e-02, -5.6469e-02, -2.4118e-02,  2.8477e-03,  6.2025e-02,\n",
       "           3.4093e-02,  8.7266e-02, -4.0727e-03, -1.6200e-02, -9.5729e-02,\n",
       "           9.6863e-02,  2.0599e-02, -3.2284e-02, -2.7144e-04, -5.5648e-02,\n",
       "           4.2468e-03, -8.3999e-02,  1.3182e-02,  6.9090e-02,  9.1008e-02,\n",
       "          -4.1328e-02, -9.2455e-02, -5.0547e-02,  9.9438e-02,  8.6291e-02,\n",
       "           7.7303e-02, -1.1292e-02,  1.7156e-02,  6.3419e-02,  4.1813e-02,\n",
       "           2.5894e-02,  6.0760e-02,  8.0399e-03, -4.4802e-02, -6.7771e-02,\n",
       "           6.9821e-02, -1.7288e-02, -4.9543e-02, -2.5602e-02, -5.6728e-03,\n",
       "           6.5324e-02, -1.2146e-02, -1.4699e-02, -7.0548e-03,  1.1972e-02,\n",
       "          -6.2117e-02,  6.9496e-02, -5.3205e-03,  7.0343e-02,  6.1392e-02,\n",
       "           2.5557e-02, -8.4114e-02,  7.7430e-02,  3.4167e-02, -6.5046e-02,\n",
       "          -3.0217e-02,  3.1572e-02,  4.5057e-02, -1.4256e-02, -2.0696e-02,\n",
       "           1.5465e-02, -5.6380e-02, -2.2079e-02,  2.1807e-02, -9.6838e-02,\n",
       "           1.2528e-02, -8.9051e-04,  1.8499e-03, -9.1176e-02,  2.3863e-02,\n",
       "           5.0387e-02,  2.1508e-02, -7.2955e-02, -3.5907e-02,  9.3953e-02,\n",
       "          -1.2947e-02,  4.1430e-02, -2.0948e-02,  7.4907e-02, -3.6863e-02,\n",
       "           5.4492e-02,  7.1919e-02,  5.7950e-02,  9.6871e-02,  4.4650e-03,\n",
       "          -7.3459e-02,  4.2810e-02, -5.2729e-02,  7.3781e-03,  2.4983e-02,\n",
       "          -2.5843e-02, -3.6585e-02,  5.4754e-02,  2.5113e-02, -3.4028e-02],\n",
       "         [-2.0272e-02, -2.6098e-02, -3.5254e-02,  6.5835e-02, -1.8086e-02,\n",
       "           9.4924e-02, -6.7300e-02, -4.4292e-02,  3.5017e-02,  4.1477e-02,\n",
       "           2.9760e-02,  1.9462e-02,  7.9448e-02,  7.0622e-02, -1.0731e-02,\n",
       "           8.1297e-02,  6.9009e-02,  5.4128e-02, -6.0256e-02, -3.5978e-02,\n",
       "          -5.7329e-02, -9.4381e-02, -9.0182e-05, -4.0762e-02, -9.4698e-02,\n",
       "           2.5186e-02, -7.4458e-02,  9.6490e-02, -7.7758e-02, -6.8517e-02,\n",
       "           8.7027e-02,  5.4575e-02, -1.8995e-02, -6.0338e-02, -4.5975e-02,\n",
       "          -1.7599e-03,  2.2355e-02, -2.2834e-02, -3.6344e-02,  5.8794e-02,\n",
       "           7.5517e-02,  2.2504e-02,  3.8834e-02,  5.8300e-02,  6.5405e-02,\n",
       "           7.8060e-02, -4.3544e-02, -9.5397e-02, -6.3778e-02,  1.3295e-02,\n",
       "          -6.9571e-02,  2.5627e-02,  5.0101e-02, -1.2324e-02,  7.0107e-02,\n",
       "           6.0454e-02,  1.5690e-02,  1.1887e-02,  2.7306e-02,  1.7041e-02,\n",
       "           5.8931e-02, -7.5082e-02,  9.8081e-02,  2.2022e-03,  7.3706e-02,\n",
       "           7.4836e-02, -5.0823e-02, -7.2554e-02,  2.1874e-02,  1.4957e-02,\n",
       "           6.6711e-02,  7.4283e-02, -9.0975e-02,  6.4661e-04, -7.4488e-02,\n",
       "          -7.1734e-03, -3.6093e-02,  9.5196e-02, -5.7368e-02, -5.2387e-02,\n",
       "           1.8518e-02, -8.8418e-02, -5.7015e-02, -6.3310e-02, -6.2587e-02,\n",
       "           9.5190e-02,  6.3477e-02,  3.4285e-02,  8.0994e-02, -9.9416e-02,\n",
       "           8.0272e-02, -1.5784e-02, -2.4889e-02, -6.3513e-02,  2.1233e-02,\n",
       "          -4.8740e-02, -4.4626e-02, -2.9489e-02, -4.3910e-02, -2.6853e-02],\n",
       "         [ 2.2553e-02,  5.7787e-02,  7.6605e-02, -1.3937e-02,  3.4828e-02,\n",
       "           7.4394e-03, -8.1627e-02, -5.6727e-02,  8.5566e-02,  9.5948e-02,\n",
       "          -3.8190e-02,  8.4887e-02,  3.0882e-02, -7.2979e-02,  3.4050e-02,\n",
       "          -4.3464e-03,  4.7027e-02,  4.8285e-02, -2.7525e-02, -1.7838e-02,\n",
       "          -3.9210e-02,  2.2252e-02,  6.6926e-02, -4.6483e-02,  1.9320e-03,\n",
       "          -6.3248e-02,  2.0946e-02,  9.2224e-02,  4.6835e-02, -3.4314e-02,\n",
       "          -4.6392e-02,  4.8840e-02, -7.0610e-02, -2.4506e-02,  6.2043e-02,\n",
       "           6.1547e-02,  1.8737e-02,  8.6979e-02,  8.2736e-02,  4.4976e-02,\n",
       "          -9.9432e-02, -1.9458e-02, -4.7503e-02,  2.2037e-03, -2.4531e-02,\n",
       "          -3.2963e-02, -6.0070e-02,  7.3610e-02,  9.1391e-02,  7.9085e-02,\n",
       "          -4.9450e-02, -1.8711e-02,  7.1049e-02,  5.5360e-02, -3.6398e-02,\n",
       "           5.0673e-03,  5.7242e-02,  8.1667e-02,  7.9171e-02,  6.3082e-02,\n",
       "           1.5579e-02, -4.9132e-02,  3.3692e-02, -1.1035e-02,  9.3164e-02,\n",
       "          -9.4011e-02, -2.8274e-02,  9.3688e-02,  2.5784e-02, -1.6043e-02,\n",
       "           3.8877e-02,  9.9032e-02, -7.5760e-03, -8.1686e-02, -5.3740e-02,\n",
       "          -8.0734e-02,  8.1564e-02,  1.2183e-02, -1.1510e-02,  6.0907e-02,\n",
       "           3.8897e-02,  7.9597e-02, -6.1109e-02, -2.4880e-02, -8.0845e-02,\n",
       "          -8.5386e-02,  3.9125e-02, -4.1459e-02,  4.4913e-02, -5.0061e-02,\n",
       "          -8.7489e-02,  3.5614e-02, -5.1830e-02, -3.5232e-02, -8.2579e-02,\n",
       "          -3.7282e-02, -9.1524e-02,  5.0058e-02,  5.5545e-02,  3.8163e-02],\n",
       "         [-4.2735e-02,  7.4983e-02, -2.5832e-02,  7.8953e-02, -1.3125e-02,\n",
       "           9.3169e-02,  8.3457e-02, -4.3767e-03, -6.0193e-02, -6.3643e-02,\n",
       "          -9.7723e-02, -4.9910e-02, -3.9301e-02, -9.7980e-02, -5.5875e-02,\n",
       "           9.6158e-03,  1.0964e-02,  8.3377e-02,  6.6397e-02, -1.7060e-02,\n",
       "           7.9653e-02,  9.4882e-02,  6.4294e-02,  1.4417e-02,  5.8311e-02,\n",
       "          -9.3202e-02, -7.9175e-02,  6.6454e-02,  2.8779e-02, -6.4650e-02,\n",
       "          -6.5455e-02, -9.5347e-02, -9.5918e-02,  9.2232e-02, -1.0181e-03,\n",
       "          -3.2615e-02,  6.5427e-02, -7.6334e-02, -8.1622e-02,  9.0925e-02,\n",
       "          -1.2414e-02, -4.1181e-02, -5.4501e-02, -4.8042e-02, -1.2828e-02,\n",
       "           6.8894e-02, -1.7334e-02,  8.4012e-02,  8.8176e-02,  9.9925e-02,\n",
       "           3.8857e-02, -6.0587e-02, -8.4486e-02, -1.2342e-02, -6.8648e-02,\n",
       "           8.7262e-02,  5.4098e-02, -9.1289e-02, -3.8679e-02,  4.9104e-02,\n",
       "          -6.9600e-02,  3.8091e-02,  7.3750e-02, -4.9993e-02, -6.3695e-02,\n",
       "           2.4280e-02,  7.2560e-02, -5.1208e-02,  1.1054e-02,  4.1050e-03,\n",
       "           6.9589e-02, -5.7591e-02,  2.2269e-03,  4.0758e-02, -9.3573e-02,\n",
       "          -9.9583e-02,  8.3100e-02, -7.1607e-03, -9.5885e-02, -3.8689e-02,\n",
       "          -6.2335e-02,  8.7186e-02, -9.3257e-02, -4.3535e-02,  7.9183e-02,\n",
       "          -8.5968e-02, -3.6694e-03,  1.5926e-02, -3.8060e-02, -6.8370e-02,\n",
       "          -5.0627e-02,  6.7571e-02, -6.3141e-02, -1.5861e-02,  2.8539e-02,\n",
       "           8.3734e-02,  1.4726e-02, -1.3181e-02, -9.6111e-03,  9.3756e-02],\n",
       "         [-5.2996e-02, -7.0385e-02, -9.6327e-02,  8.3523e-02,  2.4671e-03,\n",
       "           5.0742e-02, -6.6661e-02, -2.6170e-02, -8.9665e-02,  2.7752e-02,\n",
       "          -5.4534e-02, -5.5255e-02, -5.8112e-02,  1.7749e-02, -9.6402e-02,\n",
       "          -3.5178e-03,  6.9083e-02, -9.7950e-02,  5.3294e-02, -5.1315e-02,\n",
       "          -4.3112e-02, -2.4984e-02, -1.2908e-02, -1.8296e-02, -6.9704e-02,\n",
       "           2.8890e-02, -8.3907e-02,  3.3655e-02,  1.8901e-02,  8.0955e-02,\n",
       "          -1.5647e-02, -6.8078e-02,  9.0544e-02,  6.4211e-03,  6.9318e-03,\n",
       "           3.6761e-05, -5.1736e-02, -5.4680e-02,  4.0066e-02, -2.6657e-03,\n",
       "          -1.5222e-02, -1.5149e-02, -8.0847e-02,  8.0354e-02, -6.5082e-02,\n",
       "          -2.2915e-02,  9.2135e-02, -3.4896e-02, -4.1256e-02,  7.0713e-02,\n",
       "          -5.0855e-03, -6.1949e-02, -7.9824e-02, -4.0126e-02,  2.4830e-02,\n",
       "           9.5677e-03, -3.9138e-02,  4.9502e-02,  2.2308e-03,  6.7772e-02,\n",
       "           1.7789e-02,  4.5394e-03, -8.5944e-02,  8.5695e-02,  4.1323e-02,\n",
       "          -1.4062e-02, -9.7508e-02, -3.1689e-02,  2.6047e-02, -3.3457e-02,\n",
       "          -3.5975e-02,  8.4094e-02, -5.7605e-02, -6.0991e-02,  7.1586e-02,\n",
       "           3.6367e-02, -6.6270e-02,  4.7266e-02, -4.7855e-02,  9.3260e-02,\n",
       "          -3.6200e-02,  4.7859e-02, -2.8560e-02, -4.2349e-02, -8.1447e-02,\n",
       "           1.3653e-03, -1.1486e-02, -6.2813e-02,  5.9308e-02,  2.1214e-03,\n",
       "          -8.3058e-02, -9.2758e-02,  2.8494e-03,  1.5643e-02, -9.5568e-02,\n",
       "           2.5422e-02,  3.3993e-02, -3.6939e-02,  7.7705e-02,  4.4030e-02],\n",
       "         [-3.9163e-02,  7.7779e-02,  9.3780e-02,  9.8401e-02,  3.1464e-02,\n",
       "          -6.6333e-02, -1.8339e-02,  3.1520e-02,  5.1215e-02, -3.0264e-05,\n",
       "           7.4819e-02, -3.6924e-02, -4.0751e-02,  1.3653e-02, -2.1170e-02,\n",
       "          -4.9227e-02,  1.9438e-02,  6.7475e-02, -5.5162e-02, -7.0041e-02,\n",
       "          -5.3930e-02, -4.2869e-02,  5.2169e-02,  3.3356e-02,  4.3734e-02,\n",
       "          -4.1245e-02,  3.7647e-02, -6.6262e-02,  9.5902e-02,  5.9551e-02,\n",
       "          -1.5889e-02, -6.9107e-02, -7.7984e-02, -2.4793e-02,  1.8775e-02,\n",
       "          -6.7870e-02,  1.0806e-02, -1.4949e-02,  4.0774e-02, -7.5324e-02,\n",
       "           7.9189e-03, -4.5602e-02,  5.8100e-02, -6.4560e-02, -9.4911e-02,\n",
       "          -3.0896e-02, -8.0078e-02,  2.3227e-03,  6.0242e-03, -3.9741e-02,\n",
       "           4.2950e-02, -9.8348e-02, -7.8969e-02, -5.3365e-02, -5.3866e-02,\n",
       "           8.5831e-02,  8.7494e-02, -5.0679e-02,  7.3315e-02, -6.5647e-02,\n",
       "           1.6662e-02, -5.7842e-02,  9.6313e-02, -2.9199e-02,  7.2222e-03,\n",
       "           8.9127e-02, -4.4058e-02, -2.1950e-02, -6.1154e-02, -8.9735e-02,\n",
       "          -5.0530e-02, -4.2414e-02, -6.7282e-02, -6.4318e-02,  7.3486e-02,\n",
       "           5.5463e-02,  4.5351e-02,  7.1975e-02,  1.6958e-02, -5.5575e-03,\n",
       "          -7.3893e-02,  4.3656e-02, -3.1362e-02, -7.7830e-02, -3.0080e-02,\n",
       "           7.4299e-02,  1.4069e-02,  3.2423e-03, -6.7345e-03, -9.8714e-02,\n",
       "           9.7297e-02,  1.8028e-02,  6.3269e-02,  7.9599e-02,  8.6055e-02,\n",
       "          -1.1195e-02, -8.8723e-02, -8.9679e-02,  6.8220e-02,  3.7052e-02],\n",
       "         [-5.0884e-02,  1.7397e-02,  9.9335e-02,  7.8343e-02, -5.7422e-02,\n",
       "           3.3380e-02,  7.8095e-02,  7.3559e-03, -3.0529e-02, -8.6019e-02,\n",
       "          -9.7944e-02, -2.0383e-02,  7.4645e-02,  8.5455e-02, -8.4510e-02,\n",
       "          -2.8003e-02,  3.9870e-02,  3.4922e-02, -6.3111e-02,  5.5676e-02,\n",
       "           3.4568e-02, -1.8579e-02, -1.0877e-02, -5.7483e-02,  3.0285e-02,\n",
       "          -2.8339e-02, -4.1197e-02, -9.1574e-02,  6.2976e-02,  7.8220e-02,\n",
       "          -4.8268e-02, -5.7704e-02, -2.2366e-02, -8.3761e-02,  1.6709e-02,\n",
       "           8.7675e-02, -7.1011e-02,  1.0057e-02,  4.0722e-02, -9.5205e-02,\n",
       "          -3.3361e-02, -8.8058e-02, -3.4851e-02,  5.6327e-02,  2.3318e-02,\n",
       "           3.7629e-02, -3.2838e-02, -3.6655e-02, -3.2681e-02,  8.7473e-02,\n",
       "          -6.7529e-02, -3.4443e-02,  6.0734e-02,  2.1919e-02,  9.8707e-02,\n",
       "          -4.4738e-02, -3.7663e-02, -2.3598e-02,  2.1961e-02,  8.0849e-02,\n",
       "           8.1710e-02, -5.1493e-03, -4.5691e-02, -5.6042e-02,  8.5086e-03,\n",
       "          -2.1483e-03,  4.4738e-02,  9.3606e-02, -2.0618e-02, -5.3181e-02,\n",
       "           8.1217e-02, -6.7421e-02, -9.5440e-02, -7.2797e-02,  4.4924e-02,\n",
       "          -5.2523e-02, -8.6931e-02, -2.6960e-02, -6.6091e-02,  7.3456e-02,\n",
       "           3.8923e-02,  2.6424e-02, -8.3721e-02, -8.6824e-02,  8.9397e-02,\n",
       "          -5.5744e-02, -8.8313e-02, -5.9623e-02,  7.8721e-02, -1.1191e-02,\n",
       "          -6.1883e-02,  6.9515e-02,  2.3120e-02,  3.8635e-02, -2.5766e-03,\n",
       "           9.4910e-02, -4.5146e-02, -8.8752e-02, -4.8876e-02, -3.0467e-02],\n",
       "         [-4.7365e-02,  2.3454e-02,  1.6903e-03, -8.0119e-03,  7.7530e-02,\n",
       "           6.9935e-02, -5.8023e-02,  5.3127e-02, -2.5248e-02,  9.8465e-02,\n",
       "          -6.7794e-02, -8.2243e-02,  3.2573e-02,  6.6041e-02, -1.7520e-02,\n",
       "           8.2043e-02, -9.0820e-02,  6.0630e-02, -9.0018e-02,  3.2176e-02,\n",
       "          -2.7580e-03, -7.9900e-02, -3.3162e-02,  4.8858e-02,  2.3516e-02,\n",
       "           7.4353e-03,  7.3506e-02,  8.4613e-02, -2.0183e-02, -3.5591e-02,\n",
       "           3.1127e-02,  3.1976e-02,  4.8736e-02,  5.0565e-02,  2.1928e-02,\n",
       "          -7.4405e-02,  3.6853e-02,  6.3862e-02,  7.0090e-02,  4.8305e-02,\n",
       "          -2.5248e-02,  7.6621e-02, -2.8670e-02, -6.5772e-02, -6.7253e-03,\n",
       "          -8.7808e-02,  3.4159e-02, -7.1141e-02, -1.3830e-02,  5.7857e-02,\n",
       "          -5.2984e-02,  9.3719e-02,  1.1987e-02, -3.9831e-02,  1.1271e-02,\n",
       "          -4.4944e-02,  6.3439e-03,  6.6438e-02,  1.8148e-02, -6.4504e-02,\n",
       "           7.5536e-02, -1.8843e-02,  5.1311e-02,  4.7821e-02,  2.6174e-02,\n",
       "           1.5477e-02,  5.3313e-02,  6.7096e-03, -2.1130e-02,  2.7623e-02,\n",
       "           9.9707e-02,  6.2708e-02,  1.4901e-02,  5.0598e-02, -3.6035e-02,\n",
       "          -6.3976e-02, -4.0707e-02, -7.7343e-02,  7.9341e-02,  6.9484e-02,\n",
       "           6.7096e-03,  9.2365e-02, -7.7539e-02, -5.8387e-02,  2.1630e-02,\n",
       "           6.2320e-02,  7.4644e-02,  5.6363e-02,  9.7591e-02,  8.6303e-02,\n",
       "           3.6068e-02,  5.1991e-02,  1.0877e-02, -4.4083e-02,  5.4720e-02,\n",
       "          -2.5921e-02, -8.8126e-02, -9.8415e-02, -4.6304e-02,  5.4041e-02],\n",
       "         [-3.2327e-02, -1.5417e-02, -3.9047e-02,  5.9202e-02, -4.1839e-02,\n",
       "          -9.2360e-02,  9.7261e-02, -7.9903e-02,  5.7483e-03,  7.0090e-02,\n",
       "          -7.2755e-02,  3.2448e-02,  6.8316e-02, -9.3950e-03,  3.1156e-02,\n",
       "          -2.6204e-02,  1.1205e-02,  2.8629e-02,  9.0156e-02, -5.3397e-02,\n",
       "          -7.1462e-03, -7.9236e-02,  2.4896e-02,  7.4862e-02,  6.2745e-02,\n",
       "           2.3421e-03,  5.9137e-02,  9.9087e-02,  5.4540e-02, -3.2568e-02,\n",
       "           2.8993e-02, -9.0109e-02, -1.3040e-02,  6.8755e-02,  1.2723e-02,\n",
       "          -8.7318e-02, -3.3464e-02,  7.9010e-02,  3.0978e-02, -9.5365e-02,\n",
       "           2.3138e-02, -4.9745e-02,  6.4448e-02,  9.5476e-02, -3.4436e-02,\n",
       "          -2.9409e-02, -4.6208e-02, -9.1145e-02,  9.5921e-02,  7.2684e-02,\n",
       "          -3.2409e-02,  7.8647e-02,  9.4710e-02, -3.9969e-02,  5.0016e-02,\n",
       "          -9.8687e-02, -4.0387e-02, -9.8400e-02, -2.0046e-03,  4.8355e-02,\n",
       "          -9.6296e-02,  2.4923e-02,  3.5862e-02, -8.5934e-02, -4.8594e-02,\n",
       "          -5.9739e-02,  4.1270e-02, -8.1680e-04, -9.4964e-02,  1.9488e-02,\n",
       "           4.2441e-02, -8.2805e-02, -3.7143e-02, -6.9451e-02, -9.1879e-02,\n",
       "           8.5435e-02, -1.4236e-04, -6.5540e-02,  9.9735e-02, -3.6915e-02,\n",
       "          -7.5221e-02, -2.7772e-03, -6.4398e-02,  6.0501e-02, -4.8667e-02,\n",
       "          -1.4287e-02, -6.2867e-03, -3.4124e-02, -6.4006e-02,  7.1459e-02,\n",
       "           3.1471e-05, -8.9717e-02,  6.5999e-02,  6.3984e-02,  6.2654e-02,\n",
       "           8.8311e-03, -5.2434e-02, -2.9411e-02, -4.6105e-02, -3.3724e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([ 0.0324,  0.0752,  0.0561, -0.0237, -0.0877, -0.0654,  0.0702, -0.0877,\n",
       "          0.0698,  0.0145], requires_grad=True)]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 39
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "训练模型",
   "id": "d757dd4721b77fa6"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.757266Z",
     "start_time": "2025-03-09T06:50:03.754714Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.定义损失函数(采用交叉熵损失函数)\n",
    "\"\"\"\n",
    "这行代码定义了一个交叉熵损失函数对象 loss_fct。在深度学习中，损失函数用于衡量模型的预测结果与真实标签之间的差异，训练模型的目标就是通过不断调整模型的参数，使得损失函数的值尽可能小。\n",
    "nn.CrossEntropyLoss()是 PyTorch 中用于多分类问题的一个常用损失函数。它结合了softmax激活函数和交叉熵损失的计算。具体来说：softmax函数：在多分类问题中，模型的输出通常是每个类别的得分（logits），softmax函数会将这些得分转换为概率分布，使得所有类别的概率之和为 1\n",
    "交叉熵损失：交叉熵用于衡量两个概率分布之间的差异。\n",
    "在nn.CrossEntropyLoss()中，输入的是模型的原始得分（logits），它会自动在内部应用softmax函数将得分转换为概率分布，然后计算交叉熵损失。\n",
    "\"\"\" \n",
    "loss_fct = nn.CrossEntropyLoss() #内部先做softmax，然后计算交叉熵(sooftmax是在CrossEntropyLoss里面做的) \n",
    "# 2.定义优化器(采用SGD优化器)\n",
    "\"\"\"\n",
    "这行代码定义了一个随机梯度下降（SGD）优化器对象 optimizer。优化器的作用是根据损失函数的梯度来更新模型的参数，使得损失函数的值逐渐减小。\n",
    "\"\"\"\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)  # lr学习率，momentum动量"
   ],
   "id": "8a1ff9f577a8de43",
   "outputs": [],
   "execution_count": 40
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:50:03.761271Z",
     "start_time": "2025-03-09T06:50:03.758166Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "# 自定义评估函数\n",
    "@torch.no_grad()  # 装饰器，禁止梯度计算，节约内存\n",
    "def evaluating(model, DataLoader,loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in DataLoader:\n",
    "        \"\"\"\n",
    "        datas = datas.to(device)\n",
    "        功能：这行代码的作用是将当前批次的数据 datas 移动到指定的设备 device 上。在深度学习中，尤其是使用 GPU 进行加速计算时，需要确保数据和模型都在同一个设备上，否则会导致运行错误。\n",
    "        to() 方法：to() 是 torch.Tensor 对象的一个方法，它可以用于改变张量的数据类型、设备等。当传入一个 torch.device 对象作为参数时，它会将张量移动到指定的设备上。如果 datas 已经在指定的设备上，to() 方法不会进行任何操作，直接返回原张量。\n",
    "        \"\"\"\n",
    "        datas = datas.to(device)  # device 是一个 torch.device 对象，用于指定数据和模型应该运行的设备，可以是 CPU 或者 GPU\n",
    "        labels = labels.to(device)\n",
    "        \"\"\"\n",
    "        前向计算是指输入数据从神经网络的输入层开始，依次经过各个隐藏层，最终到达输出层的过程。在这个过程中，数据会按照神经网络的结构和参数进行一系列的线性变换和非线性激活操作，最终得到模型的输出结果。\n",
    "        \"\"\"\n",
    "        logits = model(datas)  # 前向传播\n",
    "        loss = loss_fct(logits, labels)  # 计算损失 loss是一个torch.Tensor对象\n",
    "        loss_list.append(loss.item())  # 记录损失 item()是张量对象的方法，用于将只有一个元素的张量转换为标量\n",
    "        \"\"\"\n",
    "        logits：它是模型的原始输出，通常是一个 torch.Tensor 类型的张量。在分类问题里，logits 表示模型对每个样本属于各个类别的预测得分，这些得分是未经过归一化的。logits 的形状一般为 (N, C)，其中 N 是批量大小（即一个批次中的样本数量），C 是类别数量。\n",
    "        argmax：这是 PyTorch 中 torch.Tensor 对象的一个方法，用于返回张量中指定维度上最大值的索引。简单来说，就是找出在某个维度上数值最大的元素所在的位置。\n",
    "        axis=-1：axis 参数用于指定在哪个维度上进行最大值索引的查找。axis=-1 表示在最后一个维度上进行操作。在 logits 的形状 (N, C) 中，最后一个维度（即 C 这个维度）对应着不同的类别，所以 axis=-1 意味着在每个样本的各个类别得分中找出最大值对应的索引。\n",
    "        \"\"\"\n",
    "        preds = logits.argmax(axis=-1) \n",
    "        # print(f'评估中的preds.shape{preds.shape}')\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())  # 记录预测结果  extend()会将可迭代对象中的每个元素逐个添加到列表末尾\n",
    "        label_list.extend(labels.cpu().numpy().tolist())  # 记录真实标签\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list) # 计算平均准确率\n",
    "    return np.mean(loss_list), acc  # 返回平均损失和平均准确率"
   ],
   "id": "bb8f5f12507fe607",
   "outputs": [],
   "execution_count": 41
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:51:00.156854Z",
     "start_time": "2025-03-09T06:50:03.762058Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 训练\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict={\n",
    "        'train':[],\n",
    "        'val':[]\n",
    "    }\n",
    "    global_step = 0\n",
    "    model.train()  # 用于将模型设置为训练模式，在深度学习中，模型大致有两种模式：训练模式和评估模式。不同模式下模型中的某些层会展现出不同的行为\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar: # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch): # 训练epoch次\n",
    "            for datas, labels in train_loader: # 遍历训练集\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                \n",
    "                optimizer.zero_grad()  # 每次训练前清空梯度\n",
    "                # 训练\n",
    "                logits = model(datas)  # 前向传播\n",
    "                loss = loss_fct(logits, labels)  # 计算损失\n",
    "                \"\"\"\n",
    "                与前向传播相反，反向传播是从输出层开始，将损失函数的梯度（导数）沿着神经网络的反向逐层传播，计算每个参数对损失函数的梯度。\n",
    "                \"\"\"\n",
    "                loss.backward()  # 反向传播,计算梯度并存储在参数的 .grad 属性中(更新梯度)\n",
    "                optimizer.step() # 梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "                preds = logits.argmax(axis=-1)  # 计算预测结果\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算每个批次的准确率\n",
    "                loss = loss.cpu().item()  # 损失值\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                }) # 记录训练集信息，每一步的损失，准确率，步数\n",
    "                \n",
    "                # 评估\n",
    "                if global_step % eval_step == 0:  # 每 eval_step 步评估一次\n",
    "                    model.eval()  # 进入评估模式，@no_grad()装饰器会禁止梯度计算，节约内存\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)  # 评估模型\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()  # 进入训练模式\n",
    "                global_step += 1 # 全局步数加1\n",
    "                pbar.update(1) # 更新进度条 辅助tqdm显示进度\n",
    "                pbar.set_postfix({\"epoch\": epoch_id}) # 设置进度条显示信息  辅助tqdm显示进度\n",
    "                \n",
    "    return record_dict\n",
    "\n",
    "epoch = 5 #改为40\n",
    "model = model.to(device)  # 把模型放入GPU\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "id": "266ec2978256fa71",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/9375 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "e78d2aec02f3488abeade75aac285250"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 42
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:51:00.160100Z",
     "start_time": "2025-03-09T06:51:00.157598Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"train\"][-5:]",
   "id": "f0a253b927fe5b52",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.2696589231491089, 'acc': 0.875, 'step': 9370},\n",
       " {'loss': 0.28896117210388184, 'acc': 0.875, 'step': 9371},\n",
       " {'loss': 0.29029396176338196, 'acc': 0.9375, 'step': 9372},\n",
       " {'loss': 0.4645024538040161, 'acc': 0.875, 'step': 9373},\n",
       " {'loss': 0.13573218882083893, 'acc': 0.90625, 'step': 9374}]"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 43
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:51:00.164121Z",
     "start_time": "2025-03-09T06:51:00.160826Z"
    }
   },
   "cell_type": "code",
   "source": "record[\"val\"][-5:]",
   "id": "a9ac657e134a566",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': np.float64(0.4203103667678544), 'acc': 0.847, 'step': 5000},\n",
       " {'loss': np.float64(0.4050033495496637), 'acc': 0.8575, 'step': 6000},\n",
       " {'loss': np.float64(0.3963904791175367), 'acc': 0.8541, 'step': 7000},\n",
       " {'loss': np.float64(0.38589988029993383), 'acc': 0.8627, 'step': 8000},\n",
       " {'loss': np.float64(0.37847743961757746), 'acc': 0.8637, 'step': 9000}]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 44
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:51:00.248916Z",
     "start_time": "2025-03-09T06:51:00.164878Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1] # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns) # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid() # 显示网格\n",
    "        axs[idx].legend() # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000)) # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", range(0, last_step, 5000))) # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "id": "ea0ab1c97cf25d7",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0       0.09375\n",
      "1000    0.75000\n",
      "2000    0.81250\n",
      "3000    0.84375\n",
      "4000    0.84375\n",
      "5000    0.75000\n",
      "6000    0.87500\n",
      "7000    0.81250\n",
      "8000    0.87500\n",
      "9000    0.96875\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0       0.0567\n",
      "1000    0.7961\n",
      "2000    0.8261\n",
      "3000    0.8355\n",
      "4000    0.8448\n",
      "5000    0.8470\n",
      "6000    0.8575\n",
      "7000    0.8541\n",
      "8000    0.8627\n",
      "9000    0.8637\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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7oknnoBWy45XIiJqHY9LRG3jO5WoA4YPH46zzz5bHkQuu+wyvP322ygtLW3z+du2bcPBgwcREhKC4OBguYkranV1dTh06FCz7ysOJg3Elbaqqio5vICIiKgtPC4RtY09OkQdoNPpsGzZMqxZswZLly7Fa6+9hoceegjr169v9fnioDB69Gh8/PHHx31NjHsmIiLqCh6XiNrGoEPUQaKr/5RTTpHb3Llz5VCBr7/+WnbzW63WZs8dNWoUFi1ahNjYWDmZ80RX2Gpra+UwA2HdunXyKltKSorLfx8iIvJsPC4RtY5D14g6QFwhe+qpp7Bx40Y5yfOrr75CYWEhBg4ciLS0NDmRc9++fSgqKpITPq+55hpER0fLijZi0ufhw4flGOi//e1vOHr0aOP3FZVsbrrpJuzevRuLFy/Go48+ittvv53joImI6IR4XCJqG3t0iDpAXP1auXIlXn75ZVnJRlw1e+GFFzB9+nSMGTNGHizEXgwN+PXXX3HmmWfK599///1yoqiohpOUlCTHUze9kibu9+3bF6effrqcOCoq6Dz22GOq/q5EROT+eFwiapvGbrfbT/B1InIxsV5BWVkZvvnmG7WbQkRExOMSeQ32PxIRERERkddh0CEiIiIiIq/DoWtEREREROR12KNDREREREReh0GHiIiIiIi8DoMOERERERF5HQYdIiIiIiLyOgw6RERERETkdRh0iIiIiIjI6zDoEBERERGR12HQISIiIiIir8OgQ0RERERE8Db/DyZvm8zCJWPcAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 45
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "为什么训练集的准确率是有波动的？（心跳问题）\n",
    "因为分批次训练的时候，每批样本的梯度不是很准确，所以会使得准确率波动。"
   ],
   "id": "103b4254372105dd"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-03-09T06:51:01.289946Z",
     "start_time": "2025-03-09T06:51:00.250264Z"
    }
   },
   "cell_type": "code",
   "source": [
    "model.eval() # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "id": "48a0bf84390bcdc3",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3816\n",
      "accuracy: 0.8624\n"
     ]
    }
   ],
   "execution_count": 46
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
